Android动画

动画种类

1、View动画:View动画支持四种动画效果,分别是旋转、平移、缩放、透明度( 只能实现四种动画效果,而且会有点击事件失效的问题)。

2、帧动画:通过顺序播放一系列图像从而产生动画效果(如果播放的图片尺寸过大容易造成OOM)。

3、属性动画:通过动态地改变对象的属性值达到动画效果(可以对任意对象的属性进行动画而不仅仅是View)。

属性动画

1、ValueAnimator:是属性动画中的核心类,其作用是在一段时间内不断对值进行改变(值的动画),实现值与值之间的动画过渡,同时还能管理动画的播放次数、播放模式、设置动画监听器等,通常结合AnimatorUpdateListener监听器并在回调方法onAnimatorUpdate()中获取最新的属性值,把属性值作用于具体的对象上就能实现对象的动画效果了。 ValueAnimator是非常灵活的实现,它只操作属性值本身,这个属性值并不属于某个具体对象,但却能用于任何对象上。

2、ObjectAnimator:是ValueAnimator的子类,其作用是可以直接对任意对象的任意属性进行动画操作,实现属性值改变的同时可以作用于任意的具体的对象上,突破了View动画只能作用View的限制。一般通过静态工厂的方法来创建,主要有四个参数:作用的对象、作用的属性、初始值、目标值。

3、AnimatorSet:可以把多个动画组合到一起

插值器Interpolator:根据时间流逝的百分比来计算当前属性值改变的百分比;也就是说插值器可以确定动画的已执行时间占总时间的百分比。系统内置的有:线性插值器(匀速动画)、加速减速插值器(动画两头慢中间快)、减速插值器(动画越来越慢)。

估值器TypeEvaluator:根据当前属性值改变的百分比来计算改变后的属性值;也就是说估值器可以确定动画在一段时间内某个时间点的属性值。系统内置的有:IntEvaluator(整型属性)、FloatEvaluator(浮点型属性)、ArgbEvaluator(Color属性)。通过evaluate()方法来计算属性值,该方法有三个参数:已执行时间占总时间的百分比、属性值的初始值、属性值的最终值。

AnimatorListener:可以监听动画的开始、结束、取消、重复播放

AnimatorUpdateListener:可以监听动画的整个过程,因为动画由许多帧组成,所以每播放一帧就会执行回调方法

属性动画的原理:属性动画要求作用的对象属性提供该属性的get()和set()方法,并设置该属性的初始值和最终值,多次调用set()方法不断改变属性值,直到属性值达到最终值,从而实现动画效果。

总结:如果想让属性动画生效,必须满足以下两个条件:

(1)对象必须提供set()方法,如果没有设置初始值,还需要提供get()方法让系统自动获取初始值(如果不满足则直接Crash掉)

(2)对象的set()方法对属性所做的改变必须能带来UI上的改变(如果不满足则无动画效果但不会Crash)

如果设置的属性无效,可以通过以下方法解决

(1)给对象加上get()和set()方法,如果有权限的话

(2)用一个类来包装原始对象,间接提供get()和set()方法

(3)使用ValueAnimator让初始值改变到最终值,并在实现AnimatorUpdateListener接口,监听每一帧的动画实现对属性的改变

使用动画需要注意的地方

1、OOM问题:尽量避免使用帧动画

2、内存泄漏:应及时关闭循环播放的动画

3、兼容性问题:可以使用第三方库进行Android3.0以下版本的适配

4、动画的交互问题:在Android3.0之前的版本,将View平移后,不管是View动画还是属性动画都无法对View移动后的位置进行点击事件的响应,但是原始位置可以响应点击事件,在3.0以后的版本,View动画依然无法响应,但是属性动画改进了这一点

5、硬件加速:可以开启硬件加速,提高动画的流畅性


参考

《Android开发艺术探索》 第7章 Android动画深入分析

《Android开发进阶:从小工到专家》 第2章 View与动画

你可能感兴趣的:(Android动画)