CoronaSDK最牛逼的动画库transitionsLib
1 transitionsLib之特性
- 暂停、恢复或取消一个动画(或所有动画)
- 为动画设置tag,允许多个动画共用同一个tag,使用tag来获取和操作动画
- 以对象为粒度的动画操作,可以同时控制一个对象上所有的动画
- 42种趋势(easing)函数,允许你以不同的方式来间补(插值)你的动画,例如二次函数、指数函数、伸缩方式、弹跳方式等
- 拥有一些便捷函数,如blink(), moveTo(), moveBy(),等
2 基本transition
一个基本的transition可以以下面两种方式进行初始化:
- transition.to( target, params ):这个方式会使用一个可选的趋势函数来变换一个displayObject或GroupObject,即在一段时间内移动、旋转、淡入淡出或伸缩
- transition.from( target, params ):这和上面的方式相似,只是params里指定的值是初值,而在函数调用一刻对象的属性是终值。
第一个参数target,就是你打算变换(使其动起来)的display或group对象。
第二个参数params 是tagert的属性,以及下列名值对组成的表。这些特殊字段含义如下:
字段名 | 描述 |
time | 指定动画经历的时间,单位是毫秒。 |
delay | 指定动画开始前的毫秒延时,默认是0. |
delta | 指定对象的属性值,是否是相对数,默认为nil即false。设置成true属性值就成了相对值,否则是绝对值。 |
iterations | 动画应该重复的次数。0或-1都会导致无限次重复。 |
tag | 允许你设置的字符串,用来分类你的动画并分组控制他们。 |
transition | 为你的transition指定趋势(easing)函数,以决定起始属性以何种方式变成最终属性。 |
动画动作对应要修改的对象属性,下表已经列出:
方式 | 属性(key) | 描述 |
位移 | x,y | 从当前x/y移动到心的x/y |
旋转 | rotation | 把当前角度旋转到新的角度 |
淡入淡出 | alpha | 把当前alpha值变成新的alpha值 |
伸缩 | xScale,yScale | 把x和y伸缩到新的比例 |
调整大小 | width,height | 把当前宽度和高度调节到新的宽度和高i度 |
注意,动画进程中的动画事件如下表所列。这些事件发生时就会激发指定的监听函数。同时在调用时,对象引用也会作为监听函数的唯一参数传入:
事件 | 描述 |
onStart | 当Transition开始时被调用 |
onComplete | 当Transition结束时被调用 |
onPause | 当Transition被暂停时调用 |
onResume | 当Transition被恢复时调用 |
onCancel | 当Transition被取消时调用 |
onRepeat | 当Transition完成一次重复周期时 |
下面是一些例子:
1) 在100毫秒内从当前位置,移动到y=100:
transition.to( myObject, { time=2000, y=100 } )
2)在2秒内,在y方向(垂直)向下移动100,这里用的是y进行相对改变:
transition.to( myObject, { time=2000, y=100, delta=true } )
3)2秒之内从当前位置移动到y=400的位置(outElastic表示到达目的后弹一弹),如此动作重复四次:
transition.to( myObject, { time=2000, y=400, iterations=4, transition=easing.outElastic } )
4)在4秒内从当前位置移动到x=200的位置并回到原处(continuousLoop 表示连续来回):
transition.to( myObject, { time=4000, x=200, transition=easing.continuousLoop } )
5)在2秒内,同时旋转45度,同时把y方向上延长2倍,同时透明度变成50%:
transition.to( myObject, { time=2000, rotation=45, yScale=2, alpha=0.5 } )
重要提示:
一些对象在transition期间并不会如你所愿。举个例子,许多widget并不支持伸缩或声明后修改大小,所以你对这些对象不能使用xScale、yScale、width、height这些属性。另一个例子是物理physics body:如果你用transition来伸缩或修改物理对象的大小实际的physics body将不会连同transiztion一起伸缩。
3 控制Transition
动画在结束前,可以被暂停、恢复和取消。传给控制函数的参数,将决定控制的目标范围。
- 暂停:transition.pause(target)
- 恢复:transition.resume(target)
- 取消:transition.cancel(target)
这三个控制函数中的参数tagert可以为以下形式:
参数 | 范围 |
(none) | target指向所有运行中的transition |
transition reference | target指向一个具体的transition,控制这个transition |
object reference | target指向一个display或group对象,控制这个对象上所有的transition |
tag name(string) | 指向所有tag和此字串一致的transition |
4 趋势函数
默认情况下,从初值到终值的变化过程,是一个随时间线性改变的函数。
然而,你可以指定一个趋势函数来达到不同的效果,例如让一个对象快速地开始又逐步慢下来到达目的地。
设置方式如下:
--二次插值 transition.to( myObject, { time=2000, y=100, transition=easing.outQuad } ) --以指数插值的方式 transition.to( myObject, { time=2000, y=100, transition=easing.inOutExpo } )
5 Transition事件
- onStart
- onComplete
- onPause
- onResume
- onCancel
- onRepeat
代码示例如下:
local myObject = display.newRect( 0, 0, 100, 100 ) local function completeListener ( obj ) --when this function is invoked, the object reference is passed instead of an 'event' table print( "Transition completed on object: " .. tostring( obj ) ) end transition.to( myObject, { time=2000, alpha=0, onComplete=completeListener } )
重要提示:
如果你从内存里删除或清除了一个发生动画的display对象,并且这个Transition有一个onComplete事件,这个监听函数仍然会被调用,尽管对象已经不在屏幕上了。所以,如果对象被强行删除,其Transition事件有可能会造成程序崩溃(事件里可能还在继续访问对象)。所以,正确的做法是,在删除对象之前先cancel这个对象上所有的Transition。即先transition.cancel(object)会很有帮助。
在更大的范围里,你还应该考虑在场景转场或模块被清除时,不带参数调用transition.cancel()以清除所有的Transition。
6 快捷函数
函数 | 描述 |
transition.blink() | 闪烁 |
transition.dissolve() | 溶解 |
transition.fadeIn() | 淡入 |
transition.fadeOut() | 淡出 |
transition.moveBy() | 移动 |
transition.moveTo() | 移到 |
transition.scaleBy() | 伸缩 |
transition.scaleTo() | 伸缩到 |