Commit 734d9ccd authored by asdf's avatar asdf

表单

parent ddfebd10
......@@ -128,5 +128,8 @@
}
}
},
"defaultProject": "ng-template-generator"
}
"defaultProject": "ng-template-generator",
"cli": {
"analytics": false
}
}
\ No newline at end of file
This diff is collapsed.
......@@ -29,6 +29,7 @@
"compressing": "^1.5.0",
"ng-zorro-antd": "^8.5.2",
"rxjs": "~6.5.4",
"sass": "1.28.0",
"node-sass": "^4.0.0",
"spark-md5": "^3.0.0",
"tslib": "^1.10.0",
......@@ -55,4 +56,4 @@
"tslint": "~5.18.0",
"typescript": "~3.7.5"
}
}
\ No newline at end of file
}
import { BrowserModule } from '@angular/platform-browser';
import { NgModule, ErrorHandler } from '@angular/core';
import {MyErrorHandler} from './MyError';
import { MyErrorHandler } from './MyError';
import { AppComponent } from './app.component';
import { NgZorroAntdModule, NZ_I18N, zh_CN } from 'ng-zorro-antd';
......@@ -10,20 +10,21 @@ import { HttpClientModule } from '@angular/common/http';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { registerLocaleData } from '@angular/common';
import zh from '@angular/common/locales/zh';
import {FormComponent} from './form/form.component';
import {PlayComponent} from './play/play.component';
import {LessonTitleConfigComponent} from './common/lesson-title-config/lesson-title-config.component';
import {BackgroundImagePipe} from './pipes/background-image.pipe';
import {UploadImageWithPreviewComponent} from './common/upload-image-with-preview/upload-image-with-preview.component';
import {PlayerContentWrapperComponent} from './common/player-content-wrapper/player-content-wrapper.component';
import {CustomHotZoneComponent} from './common/custom-hot-zone/custom-hot-zone.component';
import {UploadVideoComponent} from './common/upload-video/upload-video.component';
import {TimePipe} from './pipes/time.pipe';
import {ResourcePipe} from './pipes/resource.pipe';
import {AudioRecorderComponent} from './common/audio-recorder/audio-recorder.component';
import { FormComponent } from './form/form.component';
import { PlayComponent } from './play/play.component';
import { LessonTitleConfigComponent } from './common/lesson-title-config/lesson-title-config.component';
import { BackgroundImagePipe } from './pipes/background-image.pipe';
import { UploadImageWithPreviewComponent } from './common/upload-image-with-preview/upload-image-with-preview.component';
import { PlayerContentWrapperComponent } from './common/player-content-wrapper/player-content-wrapper.component';
import { CustomHotZoneComponent } from './common/custom-hot-zone/custom-hot-zone.component';
import { UploadVideoComponent } from './common/upload-video/upload-video.component';
import { TimePipe } from './pipes/time.pipe';
import { ResourcePipe } from './pipes/resource.pipe';
import { AudioRecorderComponent } from './common/audio-recorder/audio-recorder.component';
import { FontAwesomeModule, FaIconLibrary } from '@fortawesome/angular-fontawesome';
import { fas } from '@fortawesome/free-solid-svg-icons';
import { far } from '@fortawesome/free-regular-svg-icons';
import { UploadDragonBoneComponent } from './common/upload-dragon-bone/upload-dragon-bone.component';
registerLocaleData(zh);
......@@ -40,7 +41,7 @@ registerLocaleData(zh);
TimePipe,
UploadVideoComponent,
CustomHotZoneComponent,
UploadDragonBoneComponent,
PlayerContentWrapperComponent
],
......@@ -53,7 +54,7 @@ registerLocaleData(zh);
FontAwesomeModule
],
providers: [
{provide: ErrorHandler, useClass: MyErrorHandler},
{ provide: ErrorHandler, useClass: MyErrorHandler },
{ provide: NZ_I18N, useValue: zh_CN }
],
bootstrap: [AppComponent]
......
This diff is collapsed.
......@@ -32,33 +32,94 @@
<nz-divider style="margin-top: 10px;"></nz-divider>
<div style="margin-top: -20px; margin-bottom: 5px; width: 100%;">
<div style="margin-top: -20px; margin-bottom: 5px">
<nz-radio-group [ngModel]="it.itemType" (ngModelChange)="radioChange($event, it)">
<label *ngIf="isHasRect" nz-radio nzValue="rect">矩形</label>
<label *ngIf="isHasPic" nz-radio nzValue="pic">图片</label>
<label *ngIf="isHasText" nz-radio nzValue="text">文本</label>
</nz-radio-group>
</div>
<div *ngIf="customTypeGroupArr">
<nz-radio-group [ngModel]="it.gIdx" (ngModelChange)="customRadioChange($event, it)" style="display: flex; align-items: center; justify-content: center; flex-wrap: wrap;">
<div *ngFor="let group of customTypeGroupArr; let gIdx = index" style="display: flex; ">
<label nz-radio nzValue="{{gIdx}}">{{group.name}}</label>
</div>
</nz-radio-group>
<div *ngIf="it.itemType == 'pic'">
<app-upload-image-with-preview
[picUrl]="it?.pic_url"
(imageUploaded)="onItemImgUploadSuccess($event, it)">
</app-upload-image-with-preview>
</div>
</div>
<!-- <div *ngIf="!customTypeGroupArr">
<nz-radio-group [ngModel]="it.itemType" (ngModelChange)="radioChange($event, it)" style="display: flex; align-items: center; justify-content: center">
<label *ngIf="isHasRect" nz-radio nzValue="rect">矩形</label>
<label *ngIf="isHasPic" nz-radio nzValue="pic">图片</label>
<label *ngIf="isHasText" nz-radio nzValue="text">文本</label>
</nz-radio-group>
</div> -->
<div *ngIf="it.itemType == 'text'">
<input type="text" nz-input [(ngModel)]="it.text" (blur)="saveText(it)">
</div>
<div style="width: 100%; margin-top: 5px;">
<app-audio-recorder
[audioUrl]="it.audio_url"
(audioUploaded)="onItemAudioUploadSuccess($event, it)"
></app-audio-recorder>
<div *ngIf="customTypeGroupArr && customTypeGroupArr[it.gIdx]">
<div *ngIf="customTypeGroupArr[it.gIdx].pic">
<app-upload-image-with-preview
[picUrl]="it?.pic_url"
(imageUploaded)="onItemImgUploadSuccess($event, it)">
</app-upload-image-with-preview>
</div>
<div *ngIf="customTypeGroupArr[it.gIdx].text" style="margin-top: 5px">
<input type="text" nz-input [(ngModel)]="it.text" (blur)="saveText(it)">
</div>
<div *ngIf="customTypeGroupArr[it.gIdx].anima" align="center" style="margin-top: 5px">
<button nz-button (click)="setAnimaBtnClick(i)" >
<i nz-icon nzType="tool" nzTheme="outline"></i>
配置龙骨动画
</button>
</div>
<div *ngIf="customTypeGroupArr[it.gIdx].audio" style="display: flex;align-items: center; margin-top: 5px">
<app-audio-recorder
style="margin: auto"
[audioUrl]="it.audio_url"
(audioUploaded)="onItemAudioUploadSuccess($event, it)"
></app-audio-recorder>
</div>
</div>
<!-- <div *ngIf="!customTypeGroupArr">
<div *ngIf="it.itemType == 'pic'">
<app-upload-image-with-preview
[picUrl]="it?.pic_url"
(imageUploaded)="onItemImgUploadSuccess($event, it)">
</app-upload-image-with-preview>
</div>
<div *ngIf="it.itemType == 'text'">
<input type="text" nz-input [(ngModel)]="it.text" (blur)="saveText(it)">
</div>
<div *ngIf="isHasAudio"
style="width: 100%; margin-top: 5px; display: flex; align-items: center; justify-items: center;">
<app-audio-recorder
style="margin: auto"
[audioUrl]="it.audio_url"
(audioUploaded)="onItemAudioUploadSuccess($event, it)"
></app-audio-recorder>
</div>
<div *ngIf="it.itemType == 'rect' && isHasAnima" align="center" style="margin-bottom: 5px">
<button nz-button (click)="setAnimaBtnClick(i)" >
<i nz-icon nzType="tool" nzTheme="outline"></i>
配置龙骨动画
</button>
</div>
</div> -->
</div>
</div>
......@@ -83,12 +144,29 @@
<div class="save-box">
<button class="save-btn" nz-button nzType="primary" [nzSize]="'large'" nzShape="round"
<button style="margin-left: 200px" class="save-btn" nz-button nzType="primary" [nzSize]="'large'" nzShape="round"
(click)="saveClick()" >
<i nz-icon nzType="save"></i>
Save
</button>
<div *ngIf="isCopyData" style="height: 40px; display: flex; justify-items: center;" >
<label style="margin-left: 40px" nz-checkbox [(ngModel)]="bgItem.isShowDebugLine">显示辅助框</label>
<button style="margin-left: 20px; margin-top: -5px" nz-button (click)="copyHotZoneData()"> 复制基础数据 </button>
<div style="margin-left: 10px; margin-top: -5px" >
<span>粘贴数据: </span>
<input style="width: 100px;" type="text" nz-input [(ngModel)]="pasteData" >
<button style="margin-left: 5px;" nz-button [disabled]="pasteData==''" nzType="primary" (click)="importData()">导入</button>
</div>
</div>
</div>
......@@ -98,3 +176,52 @@
<label style="opacity: 0; position: absolute; top: 0px; font-family: 'BRLNSR_1'">1</label>
<!--龙骨面板-->
<nz-modal [(nzVisible)]="animaPanelVisible" nzTitle="配置资源文件" (nzAfterClose)="closeAfterPanel()" (nzOnCancel)="animaPanelCancel()" (nzOnOk)="animaPanelOk()" nzOkText="保存">
<div class="anima-upload-btn">
<span style="margin-right: 10px">上传 ske_json 文件: </span>
<nz-upload [nzShowUploadList]="false"
nzAccept="application/json"
[nzAction]="uploadUrl"
[nzData]="uploadData"
(nzChange)="skeJsonHandleChange($event)">
<button nz-button><i nz-icon nzType="upload"></i><span>Upload</span></button>
</nz-upload>
<i *ngIf="isSkeJsonLoading" style="margin-left: 10px;" nz-icon [nzType]="'loading'"></i>
<span *ngIf="skeJsonData['name']" style="margin-left: 10px"><u> {{skeJsonData['name']}} </u></span>
</div>
<div class="anima-upload-btn">
<span style="margin-right: 10px">上传 tex_json 文件: </span>
<nz-upload [nzShowUploadList]="false"
nzAccept="application/json"
[nzAction]="uploadUrl"
[nzData]="uploadData"
(nzChange)="texJsonHandleChange($event)">
<button nz-button><i nz-icon nzType="upload"></i><span>Upload</span></button>
</nz-upload>
<i *ngIf="isTexJsonLoading" style="margin-left: 10px;" nz-icon [nzType]="'loading'"></i>
<span *ngIf="texJsonData['name']" style="margin-left: 10px"><u> {{texJsonData['name']}} </u></span>
</div>
<div class="anima-upload-btn">
<span style="margin-right: 10px">上传 tex_png 文件: </span>
<nz-upload [nzShowUploadList]="false"
nzAccept = "image/*"
[nzAction]="uploadUrl"
[nzData]="uploadData"
(nzChange)="texPngHandleChange($event)">
<button nz-button><i nz-icon nzType="upload"></i><span>Upload</span></button>
</nz-upload>
<i *ngIf="isTexPngLoading" style="margin-left: 10px;" nz-icon [nzType]="'loading'"></i>
<span *ngIf="texPngData['name']" style="margin-left: 10px"><u> {{texPngData['name']}} </u></span>
</div>
<div class="anima-upload-btn" *ngIf="customTypeGroupArr && customTypeGroupArr[curDragonBoneGIdx] && customTypeGroupArr[curDragonBoneGIdx].animaNames">
提示:需包含以下动画: {{customTypeGroupArr[curDragonBoneGIdx].animaNames.toString()}}
</div>
</nz-modal>
......@@ -81,19 +81,21 @@
}
}
h5 {
margin-top: 1rem;
.anima-upload-btn {
padding: 10px;
}
@font-face
{
font-family: 'BRLNSR_1';
src: url("/assets/font/BRLNSR_1.TTF") ;
h5 {
margin-top: 1rem;
}
//
//@font-face
//{
// font-family: 'BRLNSR_1';
// src: url("/assets/font/BRLNSR_1.TTF") ;
//}
......@@ -107,104 +109,3 @@ h5 {
//@import '../../../style/common_mixin';
//
//.p-image-uploader {
// position: relative;
// display: block;
// width: 100%;
// height: 0;
// padding-bottom: 56.25%;
// .p-box {
// position: absolute;
// left: 0;
// top: 0;
// right: 0;
// bottom: 0;
// border: 2px dashed #ddd;
// border-radius: 0.5rem;
// background-color: #fafafa;
// text-align: center;
// color: #aaa;
// .p-upload-icon {
// text-align: center;
// margin: auto;
// .anticon-upload {
// color: #888;
// font-size: 5rem;
// }
// .p-progress-bar {
// position: relative;
// width: 20rem;
// height: 1.5rem;
// border: 1px solid #ccc;
// border-radius: 1rem;
// .p-progress-bg {
// background-color: #1890ff;
// border-radius: 1rem;
// height: 100%;
// }
// .p-progress-value {
// position: absolute;
// top: 0;
// left: 0;
// width: 100%;
// height: 100%;
// text-shadow: 0 0 4px #000;
// color: white;
// text-align: center;
// font-size: 0.9rem;
// line-height: 1.5rem;
// }
// }
// }
// .p-preview {
// width: 100%;
// height: 100%;
// //background-image: url("https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png");
// @include k-img-bg();
// }
// }
//}
//
//.p-btn-delete {
// position: absolute;
// right: -0.5rem;
// top: -0.5rem;
// width: 2rem;
// height: 2rem;
// border: 0.2rem solid white;
// border-radius: 50%;
// font-size: 1.2rem;
// background-color: #fb781a;
// color: white;
// text-align: center;
//}
//
//.p-upload-progress-bg {
// position: absolute;
// width: 100%;
// height: 100%;
// display: flex;
// align-items: center;
// justify-content: center;
// & .i-text {
// position: absolute;
// text-align: center;
// color: white;
// text-shadow: 0 0 2px rgba(0, 0, 0, .85);
// }
// & .i-bg {
// position: absolute;
// left: 0;
// top: 0;
// height: 100%;
// background-color: #27b43f;
// border-radius: 0.5rem;
// }
//}
//
//
//:host ::ng-deep .ant-upload {
// display: block;
//}
<div class="position-relative">
<button nz-button (click)="setAnimaBtnClick()" style=" border-radius: 0.5rem; border: 1px solid #ddd;">
<i nz-icon nzType="tool" nzTheme="outline"></i>
{{btnName}}
</button>
<!--配置龙骨面板-->
<nz-modal [(nzVisible)]="animaPanelVisible" (nzAfterClose)="closePanel()" nzTitle="配置资源文件"
(nzOnCancel)="animaPanelCancel()" (nzOnOk)="animaPanelOk()" nzOkText="保存">
<div class="anima-upload-btn">
<span style="margin-right: 10px">上传 ske_json 文件: </span>
<nz-upload [nzShowUploadList]="false" nzAccept="application/json" [nzAction]="uploadUrl" [nzData]="uploadData"
(nzChange)="skeJsonHandleChange($event)">
<button nz-button><i nz-icon nzType="upload"></i><span>Upload</span></button>
</nz-upload>
<i *ngIf="isSkeJsonLoading" style="margin-left: 10px;" nz-icon [nzType]="'loading'"></i>
<span *ngIf="skeJsonData && skeJsonData['name']" style="margin-left: 10px"><u> {{skeJsonData['name']}} </u></span>
</div>
<div class="anima-upload-btn">
<span style="margin-right: 10px">上传 tex_json 文件: </span>
<nz-upload [nzShowUploadList]="false" nzAccept="application/json" [nzAction]="uploadUrl" [nzData]="uploadData"
(nzChange)="texJsonHandleChange($event)">
<button nz-button><i nz-icon nzType="upload"></i><span>Upload</span></button>
</nz-upload>
<i *ngIf="isTexJsonLoading" style="margin-left: 10px;" nz-icon [nzType]="'loading'"></i>
<span *ngIf="texJsonData && texJsonData['name']" style="margin-left: 10px"><u> {{texJsonData['name']}} </u></span>
</div>
<div class="anima-upload-btn">
<span style="margin-right: 10px">上传 tex_png 文件: </span>
<nz-upload [nzShowUploadList]="false" nzAccept="image/*" [nzAction]="uploadUrl" [nzData]="uploadData"
(nzChange)="texPngHandleChange($event)">
<button nz-button><i nz-icon nzType="upload"></i><span>Upload</span></button>
</nz-upload>
<i *ngIf="isTexPngLoading" style="margin-left: 10px;" nz-icon [nzType]="'loading'"></i>
<span *ngIf="texPngData && texPngData['name']" style="margin-left: 10px"><u> {{texPngData['name']}} </u></span>
</div>
<div class="anima-upload-btn" *ngIf="animaNames && animaNames.length > 0">
提示:需包含动画: {{animaNames.toString()}}.
</div>
</nz-modal>
</div>
\ No newline at end of file
@import '../../style/common_mixin.css';
.p-image-uploader {
position: relative;
display: block;
width: 100%;
height: 0;
padding-bottom: 56.25%;
.p-box {
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
border: 2px dashed #ddd;
border-radius: 0.5rem;
background-color: #fafafa;
text-align: center;
color: #aaa;
.p-upload-icon {
text-align: center;
margin: auto;
.anticon-upload {
color: #888;
font-size: 5rem;
}
.p-progress-bar {
position: relative;
width: 20rem;
height: 1.5rem;
border: 1px solid #ccc;
border-radius: 1rem;
.p-progress-bg {
background-color: #1890ff;
border-radius: 1rem;
height: 100%;
}
.p-progress-value {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
text-shadow: 0 0 4px #000;
color: white;
text-align: center;
font-size: 0.9rem;
line-height: 1.5rem;
}
}
}
.p-preview {
width: 100%;
height: 100%;
background-size: contain;
background-repeat: no-repeat;
background-position: 50% 50%;
//background-image: url("https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png");
}
}
.d-flex{
display: flex;
}
}
.p-btn-delete {
position: absolute;
right: -0.5rem;
top: -0.5rem;
width: 2rem;
height: 2rem;
border: 0.2rem solid white;
border-radius: 50%;
font-size: 1.2rem;
background-color: #fb781a;
color: white;
text-align: center;
}
.p-upload-progress-bg {
position: absolute;
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
& .i-text {
position: absolute;
text-align: center;
color: white;
text-shadow: 0 0 2px rgba(0, 0, 0, .85);
}
& .i-bg {
position: absolute;
left: 0;
top: 0;
height: 100%;
background-color: #27b43f;
border-radius: 0.5rem;
}
}
.anima-upload-btn {
padding: 10px;
}
:host ::ng-deep .ant-upload {
display: block;
}
import {ApplicationRef, Component, EventEmitter, Input, OnChanges, OnDestroy, Output} from '@angular/core';
import { NzMessageService, UploadXHRArgs, UploadFile } from 'ng-zorro-antd';
@Component({
selector: 'app-upload-dragon-bone',
templateUrl: './upload-dragon-bone.component.html',
styleUrls: ['./upload-dragon-bone.component.scss']
})
export class UploadDragonBoneComponent implements OnDestroy, OnChanges {
uploading = false;
progress = 0;
@Input()
btnName = '配置龙骨动画';
@Input()
animaNames = [];
@Input()
skeJsonData = {};
@Input()
texJsonData = {};
@Input()
texPngData = {};
@Output()
save = new EventEmitter();
@Output()
refreshEmitter = new EventEmitter();
// @Input()
// picUrl;
// @Input()
// canDelete = false;
// @Output()
// imageUploaded = new EventEmitter();
// @Output()
// imageUploadFailure = new EventEmitter();
// @Output()
// delete = new EventEmitter();
// @Input()
// picItem = null;
// @Input()
// iconSize = 2;
// @Input()
// TIP = 'Click here to upload image';
// @Input()
// disableUpload = false;
uploadUrl;
uploadData;
animaPanelVisible = false;
isSkeJsonLoading = false;
isTexJsonLoading = false;
isTexPngLoading = false;
constructor(private appRef: ApplicationRef, private nzMessageService: NzMessageService) {
this.uploadUrl = (<any> window).courseware.uploadUrl();
this.uploadData = (<any> window).courseware.uploadData();
window['air'].getUploadCallback = (url, data) => {
this.uploadUrl = url;
this.uploadData = data;
};
}
ngOnChanges() {
}
setAnimaBtnClick() {
this.animaPanelVisible = true;
this.refresh();
}
animaPanelCancel() {
this.animaPanelVisible = false;
this.refresh();
}
animaPanelOk() {
this.sendItemDragonBoneData();
this.animaPanelVisible = false;
this.refresh();
}
sendItemDragonBoneData() {
const data = {};
data['skeJsonData'] = this.skeJsonData;
data['texJsonData'] = this.texJsonData;
data['texPngData'] = this.texPngData;
this.save.emit(data);
}
skeJsonHandleChange(e) {
console.log('e: ', e);
switch (e.type) {
case 'start':
this.isSkeJsonLoading = true;
break;
case 'success':
console.log('e.file.response.url',e.file.response.url);
this.skeJsonData = {
'url':e.file.response.url,
'name': e.file.name
};
console.log('json',this.skeJsonData);
// this.skeJsonData['name'] = e.file.name;
this.nzMessageService.success('上传成功');
this.isSkeJsonLoading = false;
break;
case 'progress':
break;
}
}
texJsonHandleChange(e) {
console.log('e: ', e);
console.log('this',this);
switch (e.type) {
case 'start':
this.isTexJsonLoading = true;
break;
case 'success':
this.texJsonData = {
'url':e.file.response.url,
'name': e.file.name
};
// this.texJsonData['url'] = e.file.response.url;
// this.texJsonData['name'] = e.file.name;
this.nzMessageService.success('上传成功');
this.isTexJsonLoading = false;
break;
case 'progress':
break;
}
}
texPngHandleChange(e) {
console.log('e: ', e);
switch (e.type) {
case 'start':
this.isTexPngLoading = true;
break;
case 'success':
this.texPngData = {
'url':e.file.response.url,
'name': e.file.name
};
// this.texPngData['url'] = e.file.response.url;
// this.texPngData['name'] = e.file.name;
this.nzMessageService.success('上传成功');
this.isTexPngLoading = false;
break;
case 'progress':
break;
}
}
/**
* 刷新 渲染页面
*/
refresh() {
// this.refreshEmitter.emit();
setTimeout(() => {
this.appRef.tick();
}, 1);
}
closePanel() {
console.log(' in closePanel ');
this.refresh();
}
ngOnDestroy() {
}
}
......@@ -6,30 +6,3 @@
height: 100%;
}
.radioPaire {
float: left;
margin: 3px;
border-style: dashed;
border-color: #000;
border-width: 1px;
}
.border {
border-radius: 20px;
border-style: dashed;
padding: 20px;
margin: 20px;
/*width: 500px; */
/*//border-radius: 20px;*/
/*//border-width: 2px;*/
/*//border-color: #000000;*/
}
.border-lite {
border: 2px dashed #ddd;
border-radius: 0.5rem;
padding: 10px;
margin: 10px;
}
<div class="model-content">
<div style="padding: 10px;">
<div style="width: 300px;" align='center'>
<span>图1: </span>
<app-upload-image-with-preview
[picUrl]="item.pic_url"
(imageUploaded)="onImageUploadSuccess($event, 'pic_url')">
</app-upload-image-with-preview>
</div>
<div style="width: 300px; margin-top: 5px;" align='center'>
<span>图2: </span>
<app-upload-image-with-preview
[picUrl]="item.pic_url_2"
(imageUploaded)="onImageUploadSuccess($event, 'pic_url_2')">
</app-upload-image-with-preview>
</div>
<div style="width: 300px; margin-top: 15px;">
<span>文本: </span>
<input type="text" nz-input [(ngModel)]="item.text" (blur)="save()">
</div>
<div *ngFor="let question of item.questionList; let i = index">
<div style="border-style: dotted; border-width: 1px;">
<div style="margin-left: 5%; margin-bottom: 50px; padding-top: 20px; ">
<span style="height: 30px; font-size: 18px;">第{{i + 1}}页标题音频:</span>
<app-audio-recorder [audioUrl]="question.questionAudio"
(audioUploaded)="onQuestionAudioUploadSuccess($event, i)">
</app-audio-recorder>
<br>
<span style="height: 30px; font-size: 18px;">第{{i + 1}}页标题文本:</span>
<br>
<input style="width: 150px; " type="text" maxlength="" nz-input [(ngModel)]="question.questionTxt"
(blur)="save()">
<br>
<br>
<span style="height: 30px; font-size: 18px;">问题{{i + 1}}选项:</span>
<div *ngFor="let option of question.optionList; let j = index">
<div style="margin-top: 20px; float: left; border-width: 1px; border-style: dotted;
padding: 20px; margin-right: 20px; width: 230px;">
<span style="height: 30px; font-size: 18px;">题干音频:</span>
<app-audio-recorder [audioUrl]="option.optionAudio" (audioUploaded)="onOptionUploadSuccess($event, i, j)">
</app-audio-recorder>
<br>
<span style="height: 30px; font-size: 18px;">题干文本:</span>
<input style="width: 150px; " type="text" maxlength="" nz-input [(ngModel)]="option.text"
(blur)="save()">
<br>
<span style="height: 30px; font-size: 18px;">题干骨骼动画:</span>
<app-upload-dragon-bone [btnName]="[['配置骨骼动画']]" [animaNames]="[[['normal']]]"
[skeJsonData]=option.optionDragonBone.skeJsonData [texJsonData]=option.optionDragonBone.texJsonData
[texPngData]=option.optionDragonBone.texPngData (save)="saveAnima($event, option.optionDragonBone)"
(refreshEmitter)="refresh()">
</app-upload-dragon-bone>
<br>
<span style="height: 30px; font-size: 18px;">选项骨骼动画:</span>
<app-upload-dragon-bone [btnName]="[['配置骨骼动画']]" [animaNames]="[[['normal']]]"
[skeJsonData]=option.optionDragonBone.skeJsonData2 [texJsonData]=option.optionDragonBone.texJsonData2
[texPngData]=option.optionDragonBone.texPngData2 (save)="saveAnima2($event, option.optionDragonBone)"
(refreshEmitter)="refresh()">
</app-upload-dragon-bone>
<br>
<div style="margin-top: 5px">
<span>音频: </span>
<app-audio-recorder
[audioUrl]="item.audio_url"
(audioUploaded)="onAudioUploadSuccess($event, 'audio_url')"
></app-audio-recorder>
<div *ngIf="(question.optionList.length >= 4)">
<button style="margin-top: 20px; width: 100%; height: 32px; color: red;" nz-button nzType="dashed"
class="add-btn" (click)="removeOption(i, j)">
删除选项
</button>
</div>
</div>
</div>
<div *ngIf="(question.optionList.length < 4)">
<button style="margin-top: 20px; float: left; border-width: 1px;
border-style: dotted; padding: 20px; margin-right: 20px;
width: 230px; height: 343px;" nz-button nzType="dashed" class="add-btn" (click)="addOption(i)">
增加选项
</button>
</div>
</div>
<button style="margin-left: 5%; margin-top: 50px;margin-bottom: 8px; width: 90%; height: 32px; color: red;" nz-button nzType="dashed"
class="add-btn" (click)="removeQuestion(i)">
删除问题{{i+1}}
</button>
</div>
</div>
</div>
<button style="margin-left: 5%; margin-top: 8px; margin-bottom: 100px; height: 50px; width: 90%;" nz-button
nzType="dashed" class="add-btn" (click)="addQuestion()">
添加问题
</button>
</div>
\ No newline at end of file
@import "../style/common_mixin";
.model-content {
margin: 10px;
.card-config {
width: 100%;
height: 100%;
display: flex;
flex-direction: row;
flex-wrap: wrap;
.card-item{
width: 500px;
margin-bottom: 40px;
.border {
border-radius: 20px;
border-style: dashed;
padding:20px;
width: 100%;
}
.card-item-content{
.title {
font-size: 24px;
width: 100%;
text-align: center;
}
.section{
border-top: 1px dashed ;
padding: 10px 0;
.section-title{
font-size: 24px;
width: 100%;
}
.section-content{
display: flex;
flex-direction: column;
margin: 5px 0 10px 0;
}
}
.pic-sound-box {
width: 50%;
display: flex;
flex-direction: column;
}
.add-btn-box {
display: flex;
align-items: center;
justify-content: center;
height: 20vw;
padding: 10px;
padding-top: 5vw;
}
}
}
}
}
.clearfix:before,.clearfix:after {
content: "";
display: block;
clear: both;
}
\ No newline at end of file
......@@ -10,7 +10,7 @@ import { JsonPipe } from '@angular/common';
export class FormComponent implements OnInit, OnChanges, OnDestroy {
// 储存数据用
saveKey = "test_001";
saveKey = "DataKey_Cocos_FT11";
// 储存对象
item;
......@@ -18,24 +18,80 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy {
}
createShell() {
this.item.wordList.push({
word: '',
audio: '',
backWord: '',
backWordAudio: '',
addQuestion() {
this.item.questionList.push({
"questionAudio": "",
"questionTxt": "",
"optionList": [{
"text":"",
"optionDragonBone": {
"skeJsonData": { "url": "" },
"texJsonData": { "url": "" },
"texPngData": { "url": "" },
"skeJsonData2": { "url": "" },
"texJsonData2": { "url": "" },
"texPngData2": { "url": "" }
},
"optionAudio": ""
}, {
"text":"",
"optionDragonBone": {
"skeJsonData": { "url": "" },
"texJsonData": { "url": "" },
"texPngData": { "url": "" },
"skeJsonData2": { "url": "" },
"texJsonData2": { "url": "" },
"texPngData2": { "url": "" }
},
"optionAudio": ""
}, {
"text":"",
"optionDragonBone": {
"skeJsonData": { "url": "" },
"texJsonData": { "url": "" },
"texPngData": { "url": "" },
"skeJsonData2": { "url": "" },
"texJsonData2": { "url": "" },
"texPngData2": { "url": "" }
},
"optionAudio": ""
}]
});
this.save();
}
removeShell(idx) {
this.item.wordList.splice(idx, 1);
removeQuestion(idx) {
this.item.questionList.splice(idx, 1);
this.save();
}
ngOnInit() {
addOption(questionIdx) {
this.item.questionList[questionIdx].optionList.push({
"text":"",
"optionDragonBone": {
"skeJsonData": { "url": "" },
"texJsonData": { "url": "" },
"texPngData": { "url": "" },
"skeJsonData2": { "url": "" },
"texJsonData2": { "url": "" },
"texPngData2": { "url": "" }
},
"optionAudio": ""
});
this.save();
}
this.item = {};
removeOption(questionIdx, optionIdx) {
this.item.questionList[questionIdx].optionList.splice(optionIdx, 1);
this.save();
}
ngOnInit() {
this.item = {
tittleAudio: "",
tittleTxt: "",
questionList: []
};
// 获取存储的数据
(<any>window).courseware.getData((data) => {
......@@ -62,33 +118,34 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy {
}
/**
* 储存图片数据
* @param e
*/
onImageUploadSuccess(e, key) {
this.item[key] = e.url;
onOptionUploadSuccess(e, questionIdx, optionIdx) {
this.item.questionList[questionIdx].optionList[optionIdx].optionAudio = e.url;
this.save();
}
/**
* 储存音频数据
* @param e
*/
onAudioUploadSuccess(e, key) {
this.item[key] = e.url;
onQuestionAudioUploadSuccess(e, questionIdx) {
this.item.questionList[questionIdx].questionAudio = e.url;
this.save();
// questionTxt
}
onWordAudioUploadSuccess(e, idx) {
this.item.wordList[idx].audio = e.url;
radioClick(questionIdx, optionIdx) {
this.item.questionList[questionIdx].rightOptionIdx = optionIdx;
this.changeDetectorRef.markForCheck();
this.changeDetectorRef.detectChanges();
this.save();
}
onBackWordAudioUploadSuccess(e, idx) {
this.item.wordList[idx].backWordAudio = e.url;
saveAnima(event, group) {
group.skeJsonData = event.skeJsonData;
group.texJsonData = event.texJsonData;
group.texPngData = event.texPngData;
this.save();
}
saveAnima2(event, group) {
group.skeJsonData = event.skeJsonData2;
group.texJsonData = event.texJsonData2;
group.texPngData = event.texPngData2;
this.save();
}
......@@ -111,4 +168,4 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy {
}, 1);
}
}
\ No newline at end of file
}
{
"version": "1.1",
"key": "DataKey_Cocos_Test",
"dataArray": []
}
\ No newline at end of file
{
"version": "1.1",
"key": "DataKey_LST01",
"question": {
"type": "Image",
"text": "",
"image_url": "demo_main",
"shortAudio_url": "",
"longAudio_url": ""
},
"answerType": "Image",
"dataArray": [{
"text": "",
"image_url": "demo_1"
}, {
"text": "",
"image_url": "demo_2"
}, {
"text": "",
"image_url": "demo_3"
}, {
"text": "",
"image_url": "demo_4"
}, {
"text": "",
"image_url": "demo_5"
}, {
"text": "",
"image_url": "demo_6"
}]
}
\ No newline at end of file
{
"ver": "1.1.2",
"uuid": "c35bb2f6-f24a-4850-ae44-643f2fdc7541",
"uuid": "ea5aaedf-cabc-46c0-aba9-e7888b7ea2b2",
"isBundle": false,
"bundleName": "",
"priority": 1,
......
{
"ver": "1.1.2",
"uuid": "055f3c8d-ca18-4e0f-b0cb-68b6077415cf",
"isBundle": false,
"bundleName": "",
"priority": 1,
"compressionType": {},
"optimizeHotUpdate": {},
"inlineSpriteFrames": {},
"isRemoteBundle": {},
"subMetas": {}
}
\ No newline at end of file
{
"__type__": "cc.AnimationClip",
"_name": "animLeft",
"_objFlags": 0,
"_native": "",
"_duration": 0.08333333333333333,
"sample": 60,
"speed": 0.6,
"wrapMode": 1,
"curveData": {
"paths": {},
"comps": {},
"props": {
"eulerAngles": [
{
"frame": 0,
"value": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
}
},
{
"frame": 0.08333333333333333,
"value": {
"__type__": "cc.Vec3",
"x": -60,
"y": 0,
"z": 0
}
}
]
}
},
"events": []
}
\ No newline at end of file
{
"ver": "2.1.0",
"uuid": "e2049ddd-b9c3-4d05-b425-cc8db5e3982f",
"subMetas": {}
}
\ No newline at end of file
{
"__type__": "cc.AnimationClip",
"_name": "animLeft2",
"_objFlags": 0,
"_native": "",
"_duration": 0.08333333333333333,
"sample": 60,
"speed": 0.5,
"wrapMode": 36,
"curveData": {
"paths": {},
"comps": {},
"props": {
"eulerAngles": [
{
"frame": 0,
"value": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
}
},
{
"frame": 0.08333333333333333,
"value": {
"__type__": "cc.Vec3",
"x": -60,
"y": 0,
"z": 0
}
}
]
}
},
"events": []
}
\ No newline at end of file
{
"ver": "2.1.0",
"uuid": "a64e6c3a-3951-4032-b174-2d8c3f48ed59",
"subMetas": {}
}
\ No newline at end of file
{
"__type__": "cc.AnimationClip",
"_name": "animRight",
"_objFlags": 0,
"_native": "",
"_duration": 0.08333333333333333,
"sample": 60,
"speed": 0.6,
"wrapMode": 1,
"curveData": {
"paths": {},
"comps": {},
"props": {
"eulerAngles": [
{
"frame": 0,
"value": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
}
},
{
"frame": 0.08333333333333333,
"value": {
"__type__": "cc.Vec3",
"x": -60,
"y": 0,
"z": 0
}
}
]
}
},
"events": []
}
\ No newline at end of file
{
"ver": "2.1.0",
"uuid": "4de8018d-6335-4230-800b-5847d4e00f37",
"subMetas": {}
}
\ No newline at end of file
{
"__type__": "cc.AnimationClip",
"_name": "animRight2",
"_objFlags": 0,
"_native": "",
"_duration": 0.08333333333333333,
"sample": 60,
"speed": 0.5,
"wrapMode": 36,
"curveData": {
"paths": {},
"comps": {},
"props": {
"eulerAngles": [
{
"frame": 0,
"value": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
}
},
{
"frame": 0.08333333333333333,
"value": {
"__type__": "cc.Vec3",
"x": -60,
"y": 0,
"z": 0
}
}
]
}
},
"events": []
}
\ No newline at end of file
{
"ver": "2.1.0",
"uuid": "9f97c0e4-b548-46ab-a2d1-af72d5752189",
"subMetas": {}
}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>angle</key>
<real>93</real>
<key>angleVariance</key>
<real>23</real>
<key>blendFuncDestination</key>
<integer>771</integer>
<key>blendFuncSource</key>
<integer>770</integer>
<key>duration</key>
<real>-1</real>
<key>emitterType</key>
<real>0</real>
<key>finishColorAlpha</key>
<real>1</real>
<key>finishColorBlue</key>
<real>0.34</real>
<key>finishColorGreen</key>
<real>0.75</real>
<key>finishColorRed</key>
<real>0</real>
<key>finishColorVarianceAlpha</key>
<real>0</real>
<key>finishColorVarianceBlue</key>
<real>1</real>
<key>finishColorVarianceGreen</key>
<real>0.4</real>
<key>finishColorVarianceRed</key>
<real>0</real>
<key>finishParticleSize</key>
<real>16</real>
<key>finishParticleSizeVariance</key>
<real>10</real>
<key>gravityx</key>
<real>0</real>
<key>gravityy</key>
<real>-700</real>
<key>maxParticles</key>
<real>107</real>
<key>maxRadius</key>
<real>0</real>
<key>maxRadiusVariance</key>
<real>0</real>
<key>minRadius</key>
<real>0</real>
<key>particleLifespan</key>
<real>1.07</real>
<key>particleLifespanVariance</key>
<real>0</real>
<key>radialAccelVariance</key>
<real>0</real>
<key>radialAcceleration</key>
<real>0</real>
<key>rotatePerSecond</key>
<real>0</real>
<key>rotatePerSecondVariance</key>
<real>0</real>
<key>rotationEnd</key>
<real>-1184</real>
<key>rotationEndVariance</key>
<real>0.0</real>
<key>rotationStart</key>
<real>-1379</real>
<key>rotationStartVariance</key>
<real>60</real>
<key>sourcePositionVariancex</key>
<real>395</real>
<key>sourcePositionVariancey</key>
<real>430</real>
<key>sourcePositionx</key>
<real>364.007858546169</real>
<key>sourcePositiony</key>
<real>884.5579567779962</real>
<key>speed</key>
<real>600</real>
<key>speedVariance</key>
<real>39</real>
<key>startColorAlpha</key>
<real>1</real>
<key>startColorBlue</key>
<real>0</real>
<key>startColorGreen</key>
<real>0</real>
<key>startColorRed</key>
<real>1</real>
<key>startColorVarianceAlpha</key>
<real>0.25</real>
<key>startColorVarianceBlue</key>
<real>0.3</real>
<key>startColorVarianceGreen</key>
<real>0.44</real>
<key>startColorVarianceRed</key>
<real>0</real>
<key>startParticleSize</key>
<real>22</real>
<key>startParticleSizeVariance</key>
<real>17</real>
<key>tangentialAccelVariance</key>
<real>25</real>
<key>tangentialAcceleration</key>
<real>102</real>
<key>textureFileName</key>
<string>particle_texture.png</string>
<key>textureImageData</key>
<string>H4sIAAAAAAAAAwG2Akn9iVBORw0KGgoAAAANSUhEUgAAADcAAAA8CAYAAADCHCKFAAACfUlEQVRoge2a3XXUMBCF73B4T6ggoYLQQdIBdJDtgO0g7oASKCVLBaSDiAqyVHB5sL0sa1metWYkcc5+j9Lo554r688CLly44AHJe5Lfa/fDDJJXJL+SfGXPc+0+ZTO6xCn/p7jBpUeSPyOiRp5Oy72v0VktJO8AbAF8AXC9EL7375EBCpdi3Nfu9ywkb0h+I/l2pqiRu9oaJgwuPa8UdKC2jgODS08ZLp3yFmun6IRC8jOADfoJwpKXWKK7OJI36AVtANw6NRNiia7iBmHRho2JtvHOudHOuf6REEt0E3c0HEsQYomeznWOdZ8SnVDEo6WC3xoAQESiOryc2zrVGyPqGuAgjuQVyn1rQGLD7OHcFss7eEt2cxmm4gbXSg7JJNbOlXYNKOFca64Bts5pTsvmiMiP2TyrRki+wm9jPMdeRD7MZZo4R/IR5YUBiTUOsBuWnVE955K8FMoWV9E1oIBzNWfIkMrMEsf+Ou1TTh2ZhFRmrnNdZvlcQipz9VIwuLZbW96CuaPOSI5zXUZZC5KTCbBS3ODaw5qyhiz+G1jr3GZlOUvsnSt88ZPCxbluRRkPbJ1ryDXAwbluXT/sSR11DjHayobDaDN/L5fWOOA851o6Ze80QSpxDV4hqEaQ1rkaFz8pFmdKQCGuQdcAQ+dacw2wcg7trGvHBE1QUlzlK4RZROSXKi6VWem6bokgIh81gbPOteoazvjvlxqWXXY3fAjawKi44b3IrVFnrAnawDnnWlvXjlEtA0BEXCNXCCnUm/fJbMn+xemDZW+MuRaR35rAf14QFXJtj+nQiqUBkd2/VhgwfR7VRWJeMB0KsbSA6ccetAvuhQt/+QMcvQWLWVVeWAAAAABJRU5ErkJgglvkEC22AgAA</string>
</dict>
</plist>
{
"ver": "2.0.1",
"uuid": "ec5e42d5-891a-43ec-ad22-a47c910f0628",
"subMetas": {}
}
\ No newline at end of file
{
"__type__": "cc.AnimationClip",
"_name": "result1",
"_objFlags": 0,
"_native": "",
"_duration": 0.6666666666666666,
"sample": 60,
"speed": 1,
"wrapMode": 1,
"curveData": {
"paths": {
"lettters": {
"props": {
"scaleX": [
{
"frame": 0.5,
"value": 0,
"curve": "quintOut"
},
{
"frame": 0.6666666666666666,
"value": 1
}
],
"angle": [
{
"frame": 0.5,
"value": -45
},
{
"frame": 0.6666666666666666,
"value": 0
}
]
}
},
"dragonParent/dragonBone": {
"comps": {},
"props": {
"scale": [
{
"frame": 0,
"value": {
"__type__": "cc.Vec2",
"x": 0.1,
"y": 0.1
}
},
{
"frame": 0.4166666666666667,
"value": {
"__type__": "cc.Vec2",
"x": 1,
"y": 1
}
}
]
}
},
"dragonParent": {
"props": {
"position": [
{
"frame": 0,
"value": [
250,
218
],
"motionPath": [
[
0,
301,
107,
293,
-114,
303
],
[
-136,
296,
-107,
299,
-192,
289
]
]
},
{
"frame": 0.2,
"value": [
-216,
260
],
"motionPath": [
[
-184,
170,
-234,
205,
-128,
131
]
]
},
{
"frame": 0.4166666666666667,
"value": [
-2,
111
],
"motionPath": []
}
]
}
}
}
},
"events": []
}
\ No newline at end of file
{
"ver": "2.1.0",
"uuid": "15ba7314-ae90-4f24-82d2-41fafddb7553",
"subMetas": {}
}
\ No newline at end of file
File added
{
"ver": "2.0.1",
"uuid": "b516c90e-6e7f-4915-9ecb-e96762cd896c",
"downloadMode": 0,
"duration": 0.66275,
"subMetas": {}
}
\ No newline at end of file
File added
{
"ver": "2.0.1",
"uuid": "77d0d09c-25c7-46b8-86e3-ac2def488077",
"downloadMode": 0,
"duration": 0.195894,
"subMetas": {}
}
\ No newline at end of file
File added
{
"ver": "2.0.1",
"uuid": "af5e18fc-d086-409f-a3f3-ae2be1e0dcb5",
"downloadMode": 0,
"duration": 0.333333,
"subMetas": {}
}
\ No newline at end of file
File added
{
"ver": "2.0.1",
"uuid": "dcd876c9-19be-4007-8074-069e28524108",
"downloadMode": 0,
"duration": 3.239184,
"subMetas": {}
}
\ No newline at end of file
File added
{
"ver": "2.0.1",
"uuid": "e805b8b8-961c-4ca1-925d-c62b86d82336",
"downloadMode": 0,
"duration": 0.97575,
"subMetas": {}
}
\ No newline at end of file
File added
{
"ver": "2.0.1",
"uuid": "a709194a-2a36-4d5d-9af5-3a2235e573c5",
"downloadMode": 0,
"duration": 0.6131,
"subMetas": {}
}
\ No newline at end of file
File added
{
"ver": "2.0.1",
"uuid": "65b3e990-d42e-4690-9354-c8eb5930e05e",
"downloadMode": 0,
"duration": 1.044898,
"subMetas": {}
}
\ No newline at end of file
File added
{
"ver": "2.0.1",
"uuid": "f3967ecd-1535-44b8-aa2c-e16fac1f7861",
"downloadMode": 0,
"duration": 2.2052,
"subMetas": {}
}
\ No newline at end of file
File added
{
"ver": "2.0.1",
"uuid": "da6d6e4f-aa6c-4aba-8a9a-9038c82af8a3",
"downloadMode": 0,
"duration": 3.3701,
"subMetas": {}
}
\ No newline at end of file
File added
{
"ver": "2.0.1",
"uuid": "8d6dbc15-32a3-4785-8743-a4e55606e85b",
"downloadMode": 0,
"duration": 0.767083,
"subMetas": {}
}
\ No newline at end of file
File added
This diff is collapsed.
File added
This diff is collapsed.
File added
This diff is collapsed.
{"frameRate":24,"name":"click_finger","version":"5.5","compatibleVersion":"5.5","armature":[{"type":"Armature","frameRate":24,"name":"Armature","aabb":{"x":-46,"y":-65.68,"width":92,"height":134.18},"bone":[{"name":"root"},{"length":47,"name":"手掌","parent":"root","transform":{"x":9,"y":58.5,"skX":-93.0448,"skY":-93.0448}},{"length":25,"name":"指头根部","parent":"手掌","transform":{"x":48.6706,"y":-1.9175,"skX":-93.6651,"skY":-93.6651}},{"length":33,"name":"手指上段","parent":"指头根部","transform":{"x":27.3116,"y":3.2131,"skX":87.3862,"skY":87.3862}},{"length":36,"name":"手指下段","parent":"手指上段","transform":{"x":36.0031,"y":-0.1694,"skX":18.7859,"skY":18.7859}}],"slot":[{"name":"图层_174","parent":"指头根部"},{"name":"图层_175","parent":"手指下段"}],"skin":[{"slot":[{"name":"图层_174","display":[{"name":"手指/图层_174","transform":{"x":5.29,"y":-6.43,"skX":-173.29,"skY":-173.29}}]},{"name":"图层_175","display":[{"type":"mesh","name":"手指/图层_175","width":27,"height":91,"vertices":[-29.5,22.5,-38,-11.55,-38,-68.5,-11,-68.5,-11,-17.55,-11,22.5],"uvs":[0.31481,1,0,0.62582,0,0,1,0,1,0.55989,1,1],"triangles":[0,5,4,1,0,4,2,1,4,2,4,3],"weights":[1,3,1,2,3,0.49,4,0.51,1,4,1,1,4,1,2,3,0.49,4,0.51,1,3,1],"slotPose":[1,0,0,1,0,0],"bonePose":[3,-0.16201,-0.986789,0.986789,-0.16201,-23,10,4,0.164399,-0.986394,0.986394,0.164399,-29,-25.5],"edges":[0,1,1,2,2,3,3,4,4,5,5,0],"userEdges":[]}]}]}],"animation":[{"duration":12,"playTimes":0,"name":"normal","bone":[{"name":"手掌","translateFrame":[{"duration":3,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":20.5,"y":-18},{"duration":6,"tweenEasing":0,"x":-11.5,"y":23},{"duration":0}],"rotateFrame":[{"duration":3,"tweenEasing":0},{"duration":3,"tweenEasing":0,"rotate":14.5},{"duration":6,"tweenEasing":0,"rotate":-15},{"duration":0}]},{"name":"手指上段","rotateFrame":[{"duration":3,"tweenEasing":0,"rotate":-2.5},{"duration":3,"tweenEasing":0,"rotate":-7},{"duration":6,"tweenEasing":0,"rotate":3},{"duration":0,"rotate":-2.5}]},{"name":"手指下段","rotateFrame":[{"duration":3,"tweenEasing":0,"rotate":-12},{"duration":3,"tweenEasing":0,"rotate":-15},{"duration":6,"tweenEasing":0,"rotate":4.5},{"duration":0,"rotate":-17}]}]}],"defaultActions":[{"gotoAndPlay":"normal"}],"canvas":{"width":158,"height":194}},{"type":"MovieClip","frameRate":24,"name":"MovieClip","bone":[{"name":"root"}],"defaultActions":[{}]}]}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment