关闭

Android中的Property Animation

515人阅读 评论(0) 收藏 举报
分类:

Property Animation更改的是对象的实际属性,而View Animation中改变的是View的绘制效果,真正的View的属性保持不变。例如,对Button实施大小缩放的View Animation,无论在View Animation中如何缩放Button的大小,Button的有效点击区域还是原来的区域,其位置与大小都不变。而如果对Button实施Property Animation,则改变的是Button的实际属性。

在PropertyAnimation中,可以对动画应用以下特性:

l  持续时间(Duration):动画的持续时间。默认长度是300毫秒。

l  时间插值(TimeInterpolation):这个值能够做为计算当前动画运行时间的函数的属性值来指定,它决定动画的变化频率。

l  重复次数和行为(Repeat Country and behavoir):这个属性能够指定在动画结束时是否重新播放动画,以及重复播放的次数。还能够指定动画是否能够反向回播,如果设置了反向回播,那么动画就会先向前再向后,重复播放,直到达到播放次数。

l  动画集合(Animation sets):即可以同时对一个对象应用几个动画,这些动画可以同时播放也可以对不同动画设置不同开始偏移。

l  帧刷新延迟(Framerefreash delay):指定动画帧的刷新频率。默认是每10秒钟刷新一次,但是应用程序最终的刷新帧的速度依赖与系统的繁忙程度以及系统能够提供的底层定时器的反应速度。

(1)ValueAnimator

ValueAnimator是用于处理动画属性值的主要Property Animation时序引擎。它有所有的计算动画值的核心功能,并包含了每个动画的时序细节、动画是否重复的信息、监听接收更新事件和设置评估定制类型的能力。ValueAnimator对象保持着动画的时间轨迹,如动画的运行时间,以及动画属性的当前值。

要启动一个动画,就要创建一个ValueAnimator对象,并且要给该对象设置想要的动画的属性的开始和结束值,以及动画的持续时间。在调用start()方法开始动画的时候,整个动画期间,ValueAnimator对象会根据动画的持续时间和已经执行的时间比计算出一个时间因子(0~1),然后根据TimeInterpolator计算出另一个因子,最后TypeAnimator通过这个因子计算出属性值。

因此,应用PropertyAnimation有两个步聚:

① 计算属性值,由ValuAnimiator完成。

② 根据属性值执行相应的动作,如改变对象的某一属性。需要实现ValueAnimator.onUpdateListener接口,例如:

01   ValueAnimator animation =ValueAnimator.ofFloat(0f, 1f);

02   animation.setDuration(1000);

03   animation.addUpdateListener(newAnimatorUpdateListener() {

04       @Override

05       publicvoid onAnimationUpdate(ValueAnimator animation) {

06       }

07   });

08   animation.setInterpolator(newCycleInterpolator(3));

09   animation.start();

Animator.AnimatorListener中含有下面四中操作:

① onAnimationStart()    动画开始的时候被调用。

② onAnimationEnd()    动画结束的时候被调用,它不管动画是如何结束的。

③ onAnimationRepeat()    动画重复播放的时候被调用。

④ onAnimationCancel    动画被取消播放的时候被调用。

ValueAnimator.AnimatorUpdateListener中的onAnimationUpdate()回调方法用于监听属性的值更新时执行相应的操作,这是ValueAnimator必须要监听的事件。可以继承AnimatorListenerAdapter而不是实现AnimatorListener接口来简化操作,这个类对AnimatorListener中的方法都定义了一个空方法体,这样就只用定义想监听的事件而不用实现每个方法。例如:

01   ObjectAnimatoroa=ObjectAnimator.ofFloat(tv,"alpha", 0f, 1f);

02   oa.setDuration(3000);

03   oa.addListener(newAnimatorListenerAdapter(){

04       publicvoid on AnimationEnd(Animator animation){

05       }

06   });

07   oa.start();

ValueAnimator封装了一个TimeInterpolator,TimeInterpolator定义了属性值在开始值与结束值之间的插值方法。ValueAnimator还封装了一个TypeAnimator,根据开始、结束值与TimeIniterpolator计算得到的值计算出属性值。

(2)ObjectAnimator

ObjectAnimator继承自ValueAnimator,用来指定一个对象及该对象的一个属性,当属性值计算完成时自动设置为该对象的相应属性,即完成了Property Animation的全部两步操作。实际应用中一般都会用ObjectAnimator来改变某一对象的某一属性,但用ObjectAnimator有一定的限制(如在目标对象上需要指定用于呈现的acessor方法),要想使用ObjectAnimator,应该满足以下条件:

① 动画效果的属性必须有一个set<propertyName>格式的设置器方法。因为在动画处理期间,ObjectAnimator对象会自动的更新对应的动画效果属性,所以它必须使用这个设置器方法来访问对应的属性。例如,如果属性名是foo,那么就需要有一个setFoo()方法。

② 如果只在ObjectAnimator类的一个工厂方法中指定了一个values…参数,那么该值会被假定为动画的结束值。因此,该对象的动画效果属性就必须要有一个获取方法,用于获得动画的开始值。这个获取方法必须使用get<propertyName>()格式。例如,属性是foo,就必须有一个getFoo方法。

③ 动画属性的获取和设置方法必须操作相同类型的指定给ObjectAnimator对象开始和结束值。例如,如果构建一个下面这样的ObjectAnimator对象,就必须要有targetObejct.setPropName(float)和targetObject.getPropName(float)方法:

ObjectAnimator.ofFloat(targetObject,"propName",1f)

④ 根据属性或对象上的动画效果,可能需要调用View对象上的invalidate()方法,在更新动画效果时,强制屏幕重绘自己。在onAnimationUpdate()回调方法中做这件事情。例如,一个绘图对象的颜色属性的动画效果,在队形重绘自己时,才会将变化结果更新到屏幕上。在View对象上的所有的属性的设置器,如setAlpha()和setTranslationX()会正确的让View对象失效。

如果上述条件不满足,则不能用ObjectAnimator,而应该用ValueAnimator代替。

下面的代码把一个TextView的透明度在3秒内从0变至1:

01   tv=(TextView)findViewById(R.id.textview1);

02   btn=(Button)findViewById(R.id.button1);

03   btn.setOnClickListener(new OnClickListener() {

04       @Override

05       public void onClick(Viewv) {

06           ObjectAnimatoroa=ObjectAnimator.ofFloat(tv,"alpha", 0f, 1f);

07           oa.setDuration(3000);

08           oa.start();

09       }

10   });

根据应用动画的对象或属性的不同,可能需要在onAnimationUpdate方法中调用invalidate()方法刷新视图。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:187069次
    • 积分:2255
    • 等级:
    • 排名:第16642名
    • 原创:9篇
    • 转载:263篇
    • 译文:0篇
    • 评论:27条
    文章分类
    最新评论