Android动画分为几种:补间动画、属性动画,还有帧动画等。
补间动画并没有真正去改变其属性,当View使用补间动画变换后点击是没有效果的,因为它的真实位置还在原来的地方。
属性动画则是将View的属性进行改变从而实现动画效果。
ValueAnimator
属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。
ValueAnimator内部使用一种时间循环的机制来计算值与值之间的动画过渡。
| 1 | <animator xmlns:android="http://schemas.android.com/apk/res/android" | 
ObjectAnimator
ObjectAnimator是ValueAnimator子类,动画所给的对象,他会调用对象对应属性的get/set方法吧属性的值设置给对象的属性,直接实现动画效果。
| 1 | /** | 
常用的属性动画
| 参数的属性 | 对应的set方法 | 实现的效果 | 
|---|---|---|
| alpha | setAlpha | 改变透明度 | 
| translationX | setTranslationX | 沿X轴平移 | 
| translationY | setTranslationY | 沿Y轴平移 | 
| scaleX | setScaleX | 沿X轴缩放 | 
| scaleY | setScaleY | 沿Y轴缩放 | 
| rotationX | setRotationX | 绕X轴旋转 | 
| rotationY | setRotationY | 绕Y轴旋转 | 
| rotation | setRotation | 绕Z轴旋转 | 
ViewPropertyAnimator
ViewPropertyAnimator只能作用于View而不能作用于其他object。假如需要同时对多个属性执行动画时,ViewPropertyAnimator效率更高,代码更简洁、更易读。
| 1 | view.animate().x(500f).y(500f).start(); | 
AnimationSet组合动画
AnimationSet用于组合多个动画进行复杂的动画显示,可以设定动画的先后顺序。
| 1 | AnimatorSet animatorSet = new AnimatorSet(); | 
AnimationListener
动画执行的监听,用于监听动画回调实现自定义功能。
- onAnimationStart 动画开始 
- onAnimationRepeat 重复动画 
- onAnimationEnd 动画结束 
Interpolator插值器
动画变换时如果想实现非线性效果,则可使用Interpolator插值器。所有的Interpolator都实现了Interpolator接口,这个接口定义了一个方法:float getInterpolation(float input),此方法由系统调用,input代表动画的时间,在0和1之间,也就是开始和结束之间。
系统内置有九种:
- AccelerateDecelerateInterpolator 在动画开始与介绍的地方速率改变比较慢,在中间的时候加速
- AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速
- AnticipateInterpolator 开始的时候向后甩一点然后向前
- AnticipateOvershootInterpolator 开始的时候向后甩一点然后向前超过设定值一点然后返回
- BounceInterpolator 动画结束的时候弹起,类似小球落地
- CycleInterpolator 动画循环播放特定的次数回到原点,速率改变沿着正弦曲线
- DecelerateInterpolator 在动画开始的地方快然后慢
- LinearInterpolator 以线性常量速率改变
- OvershootInterpolator 向前超过设定值一点然后返回到原来位置
另外,插值器也可以自定义。所有的Interpolator都实现了Interpolator接口,这个接口定义了一个方法:float getInterpolation(float input),此方法由系统调用,input代表动画的时间,在0和1之间,也就是开始和结束之间。
例如:LinearInterpolator:
| 1 | public float getInterpolation(float input) { | 
PropertyValuesHolder
PropertyValuesHolder保存了动画过程中所需要操作的属性和对应的值。
| 1 | // 将需要操作的多个属性和值封装起来,一起放到ObjectAnimator中,相当于set操作。 | 
KeyFrame
Keyframe用来保存一对时间/变量的动画值。
| 1 | // fraction:代表一个动画的时间值,范围为0-1,动画从0开始,到1结束。 | 
TypeEvaluator
TypeEvaluator可用于实现自定义计算动画的变化过程。
| 1 | // 实现抛物线动画 | 
其他
同个动画可以多种方式实现,例如将View移动到(100f, 100f)坐标:
1、多个ObjectAnimator 组合
| 1 | ObjectAnimator animX = ObjectAnimator.ofFloat(view, "x", 100f); | 
2、使用ViewPropertyAnimator
| 1 | PropertyValuesHolder xHolder = PropertyValuesHolder.ofFloat("x", 100f); | 
3、使用一个ObjectAnimator + PropertyValuesHolder
| 1 | view.animate().x(100f).y(100f).start(); |