201 lines
7.3 KiB
Markdown
201 lines
7.3 KiB
Markdown
|
|
|||
|
## 快速开始
|
|||
|
|
|||
|
下面通过一个简单的缓动动画来说明如何使用动画功能。
|
|||
|
|
|||
|
![](http://xzper.qiniudn.com/2016/12/animation/17.gif)
|
|||
|
|
|||
|
### 创建EUI项目和皮肤文件
|
|||
|
|
|||
|
从项目创建向导中选择创建一个Egret EUI项目。
|
|||
|
|
|||
|
创建一个AnimationSkin.exml的皮肤文件。设置皮肤的类名为"skins.AnimationSkin"
|
|||
|
|
|||
|
![](http://xzper.qiniudn.com/2016/12/animation/18.png)
|
|||
|
|
|||
|
在**设计模式**下拖拽添加一个新的按钮到皮肤文件中。
|
|||
|
|
|||
|
![](http://xzper.qiniudn.com/2016/12/animation/01.png)
|
|||
|
|
|||
|
由于动画涉及到改变组件的旋转属性,建议将锚点设置到中心,设置按钮的宽高和描点属性。
|
|||
|
|
|||
|
![](http://xzper.qiniudn.com/2016/12/animation/19.png)
|
|||
|
|
|||
|
|
|||
|
**TIPS:** 尽量不要给要添加动画的目标对象设置自动布局(left, right, top, bottom, horizontalCenter,verticalCenter)属性。这些属性可能会使对象的x, y, widht, height属性失效,如果动画里面涉及到改变这些属性的值,那么动画的表现也会出现异常。
|
|||
|
|
|||
|
|
|||
|
### 切换到动画模式
|
|||
|
|
|||
|
动画模式的入口在编辑器的模式切换按钮组上。
|
|||
|
|
|||
|
![](http://xzper.qiniudn.com/2016/12/animation/02.png)
|
|||
|
|
|||
|
在动画模式下,下面的Panel面板中会多一个动画面板。
|
|||
|
|
|||
|
![](http://xzper.qiniudn.com/2016/12/animation/03.png)
|
|||
|
|
|||
|
请记住这个重要的面板,动画的添加,编辑和预览都将在这个面板上完成。
|
|||
|
|
|||
|
**TIPS:** 一些行为在动画模式下将会被禁用或者限制。 例如在动画模式下,无法删除/复制/粘贴显示对象,对应的快捷键也会失效。 在**非关键帧状态下**也无法设置显示对象的位置, 大小等属性。 如果要对显示对象进行操作请**切换到设计模式**或者**在关键帧下操作属性**。
|
|||
|
|
|||
|
|
|||
|
### 添加动画组和动画
|
|||
|
|
|||
|
动画是以**组为单位**进行播放的,每个动画组可以为**多个显示对象**设置动画属性。
|
|||
|
|
|||
|
首先使用动画面板左下角的'+'按钮,添加一个动画组,并设置动画组的id,这里设置id为tweenGroup。
|
|||
|
|
|||
|
![](http://xzper.qiniudn.com/2016/12/animation/04.png)
|
|||
|
|
|||
|
接下来为动画组添加第一个动画。 但是可以发现动画那一栏的添加按钮是灰色不可用的。 在添加动画之前需要先选中一个显示对象,指定动画对应的目标才能添加动画。
|
|||
|
|
|||
|
这里以刚刚添加的按钮为例,先在编辑区选中该按钮。
|
|||
|
|
|||
|
![](http://xzper.qiniudn.com/2016/12/animation/05.png)
|
|||
|
|
|||
|
此时动画面板上动画那一栏的添加按钮已经可以操作了。
|
|||
|
|
|||
|
![](http://xzper.qiniudn.com/2016/12/animation/06.png)
|
|||
|
|
|||
|
点击添加按钮将会为该对象添加一个动画。
|
|||
|
|
|||
|
![](http://xzper.qiniudn.com/2016/12/animation/07.png)
|
|||
|
|
|||
|
“button”是这个按钮的id。 如果目标对象没有设置id属性则会自动创建一个,否则使用用户设置的id。
|
|||
|
|
|||
|
### 编辑动画属性
|
|||
|
|
|||
|
每个动画对应一个动画时间轴,通过在时间轴上**添加关键帧**和**缓动行为**来改变目标对象在不同时刻的属性。 此时时间轴上还没有关键帧和动画行为。
|
|||
|
|
|||
|
![](http://xzper.qiniudn.com/2016/12/animation/08.png)
|
|||
|
|
|||
|
#### 添加关键帧
|
|||
|
|
|||
|
首先在时间轴上1s的位置点击右键选择“添加关键帧”。
|
|||
|
|
|||
|
![](http://xzper.qiniudn.com/2016/12/animation/09.png)
|
|||
|
|
|||
|
添加完成后时间轴上会使用 “■” 符号表示这是一个关键帧。
|
|||
|
|
|||
|
![](http://xzper.qiniudn.com/2016/12/animation/10.png)
|
|||
|
|
|||
|
在关键帧的位置可以设置对象的大小,位置,缩放,旋转,透明度等属性。 与设计模式类似,可以**在编辑区操作显示对象**或者**在右侧的属性面板**中可以设置关键帧属性。
|
|||
|
|
|||
|
![](http://xzper.qiniudn.com/2016/12/animation/11.png)
|
|||
|
|
|||
|
这里我们根据动画的在该时刻的状态,设置了Y,缩放,透明度,旋转,缓动函数等属性。 注意:如果关键帧的属性不填留空则表示不对该属性做改变。
|
|||
|
|
|||
|
![](http://xzper.qiniudn.com/2016/12/animation/12.png)
|
|||
|
|
|||
|
#### 创建补间动画
|
|||
|
|
|||
|
有了关键帧还不够,动画在关键帧的时候会直接将目标属性设置成关键帧的值。 如果要让目标对象”动“起来,需要添加一个补间动画。
|
|||
|
|
|||
|
在关键帧的位置或者之前的某一时刻右键选择“创建补间动画”。
|
|||
|
|
|||
|
![](http://xzper.qiniudn.com/2016/12/animation/13.png)
|
|||
|
|
|||
|
时间轴上将会使用“●”标记补间动画的开头和结束,“→”标记这一段是补间动画。
|
|||
|
|
|||
|
![](http://xzper.qiniudn.com/2016/12/animation/14.png)
|
|||
|
|
|||
|
由于在添加补间动画的位置之前没有其他的关键帧,所以该段补间动画的开头是开始0时刻的位置。
|
|||
|
|
|||
|
这样就创建了一个持续1s的补间动画,动画会不停设置目标的属性动起来。
|
|||
|
|
|||
|
#### 修改关键帧位置和补间动画时间
|
|||
|
|
|||
|
如果要改变关键帧或者补间动画的起始位置或者持续时间,可以直接在时间轴上左右拖拽关键帧的位置。
|
|||
|
|
|||
|
![](http://xzper.qiniudn.com/2016/12/animation/15.gif)
|
|||
|
|
|||
|
### 预览动画
|
|||
|
|
|||
|
动画编辑完成后可以通过**拖拽时间轴上的时间戳**或者**直接点击时间轴下方的播放按钮**预览动画。
|
|||
|
|
|||
|
![](http://xzper.qiniudn.com/2016/12/animation/16.png)
|
|||
|
|
|||
|
### 代码中调用
|
|||
|
|
|||
|
最终的皮肤文件:
|
|||
|
|
|||
|
AnimationSkin.exml
|
|||
|
|
|||
|
<?xml version="1.0" encoding="utf-8"?>
|
|||
|
<e:Skin class="skins.AnimationSkin" width="400" height="300" xmlns:e="http://ns.egret.com/eui" xmlns:w="http://ns.egret.com/wing" xmlns:tween="egret.tween.*">
|
|||
|
<w:Declarations>
|
|||
|
<tween:TweenGroup id="tweenGroup">
|
|||
|
<tween:TweenItem target="{button}">
|
|||
|
<tween:Wait duration="500"/>
|
|||
|
<tween:To duration="500">
|
|||
|
<tween:props>
|
|||
|
<e:Object y="{200}" scaleX="{1.5}" scaleY="{1.5}" rotation="{180}" alpha="{0.5}"/>
|
|||
|
</tween:props>
|
|||
|
</tween:To>
|
|||
|
</tween:TweenItem>
|
|||
|
</tween:TweenGroup>
|
|||
|
</w:Declarations>
|
|||
|
<e:Button id="button" label="按钮" x="193" y="35" width="100" height="50" anchorOffsetX="50" anchorOffsetY="25"/>
|
|||
|
</e:Skin>
|
|||
|
|
|||
|
|
|||
|
在项目中,通过以下代码,当用户点击按钮的时候播放该动画组中的动画:
|
|||
|
|
|||
|
AnimationPanel.ts
|
|||
|
|
|||
|
class AnimationPanel extends eui.Component {
|
|||
|
constructor() {
|
|||
|
super();
|
|||
|
// 设置当前面板的皮肤
|
|||
|
this.skinName = skins.AnimationSkin;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* EXML中对应id为tweenGroup的动画组对象
|
|||
|
*/
|
|||
|
public tweenGroup: egret.tween.TweenGroup;
|
|||
|
|
|||
|
/**
|
|||
|
* EXML中对应id为button的按钮对象
|
|||
|
*/
|
|||
|
public button: eui.Button;
|
|||
|
|
|||
|
/**
|
|||
|
* 动画组播放完成
|
|||
|
*/
|
|||
|
private onTweenGroupComplete(): void {
|
|||
|
console.log('TweenGroup play completed.');
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 动画组中的一项播放完成
|
|||
|
*/
|
|||
|
private onTweenItemComplete(event: egret.Event): void {
|
|||
|
const item = event.data as egret.tween.TweenItem;
|
|||
|
console.log(item.target);
|
|||
|
console.log('TweenItem play completed.');
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 当点击按钮时播放动画
|
|||
|
*/
|
|||
|
private onButtonClick(): void {
|
|||
|
this.tweenGroup.play();
|
|||
|
//this.tweenGroup.play(0);从头播放
|
|||
|
}
|
|||
|
|
|||
|
protected createChildren(): void {
|
|||
|
super.createChildren();
|
|||
|
this.tweenGroup.addEventListener('complete', this.onTweenGroupComplete, this);
|
|||
|
this.tweenGroup.addEventListener('itemComplete', this.onTweenItemComplete, this);
|
|||
|
this.button.addEventListener(egret.TouchEvent.TOUCH_TAP, this.onButtonClick, this);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
最后如果对动画的实现感兴趣可以研究下EXML中关于动画的部分,以及在GitHub上可以找到动画实现的源代码:
|
|||
|
|
|||
|
https://github.com/egret-labs/egret-core/blob/master/src/extension/tween/TweenWrapper.ts
|
|||
|
|