简单了解 Animation
动画的类型
答案参考自:
View 动画(补间动画)
只产生了一个动画效果,其真实的坐标并没有发生改变(只是改变了View的显示效果而已,并不会真正的改变View的属性)。View做在做动画的时候,它并没有真正的移动它的位置,而是根据动画时间的插值,计算出一个Matrix,然后不停的invalidate,在onDraw中的Canvas上使用这个计算出来的Matrix去draw这个View的内容,并有onLayout中还是原来的位置,所以点击事件只能点击到原来的位置才能触发
帧动画
属性动画
属性动画可以对任何对象的属性做动画而不仅仅是View,甚至可以没有对象。除了作用对象进行扩展外,属性动画的效果也加强了,不仅能实现View动画的四种效果,还能实现其它多种效果,这些效果都是通过
ValueAnimator
或ObjectAnimator
、AnimatorSet
等来实现的。我们只需要告诉系统动画的运行时长,需要执行哪种类型的动画,以及动画的初始值和结束值,剩下的工作就可以全部交给系统去完成了。
补间动画和属性动画的区别
答案参考自:
- 作用对象不同,补间动画只能作用在view上,属性动画可以作用在所有对象上。
- 属性变化不同,补间动画只是改变显示效果,不会改变view的属性,比如位置、宽高等,而属性动画实际改变对象的属性。
- 动画效果不同,补间动画只能实现位移、缩放、旋转和透明度四种动画操作,而属性动画还能实现补间动画所有效果及其他更多动画效果。
ObjectAnimator
,ValueAnimator
及其区别
ValueAnimator
ValueAnimator是整个属性动画机制当中最核心的一个类,前面我们已经提到了,属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长,那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果。除此之外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等,确实是一个非常重要的类。
ObjectAnimator
相比于ValueAnimator,ObjectAnimator可能才是我们最常接触到的类,因为ValueAnimator只不过是对值进行了一个平滑的动画过渡,但我们实际使用到这种功能的场景好像并不多。而ObjectAnimator则就不同了,它是可以直接对任意对象的任意属性进行动画操作的,比如说View的alpha属性。
不过虽说ObjectAnimator会更加常用一些,但是它其实是继承自ValueAnimator的,底层的动画实现机制也是基于ValueAnimator来完成的,因此ValueAnimator仍然是整个属性动画当中最核心的一个类。
总结
ValueAnimator
是对 数值 进行平滑操作。
1 |
|
ObjectAnimator
功能更加强大,是对 任意对象 的 任意属性值 进行平滑操作。
1 |
|
TimeInterpolator插值器,TypeEvaluator估值器
答案参考自:
插值器和估值器是实现非匀速动画的重要手段。
TimeInterpolator
时间插值器。作用为根据时间的流逝的百分比计算当前属性值改变的百分比。
预设的有多种插值器,常见的三种如下:
LinearInterpolator
——线性插值器:匀速动画AccelerateDecelerateInterpolator
——加速减速插值器:动画两头慢中间快DecelerateInterpolator
——减速插值器:动画越来越慢
三个类都实现了Interpolartor
接口,接口内部只有一个用来计算属性值的改变的百分比的getInterpolation
方法需要实现。
TypeEvaluator
类型估值算法,也叫估值器。作用是根据属性值改变的百分比来计算改变后的属性值。
系统预置的有3种:
IntEvaluator
:针对整形属性FloatEvaluator
:针对浮点型属性ArgbEvaluator
:针对Color属性
三个类都实现了TypeEvalator
接口,接口内部只有一个用来计算改变后的属性值的evaluate
方法需要实现。
计算顺序
系统会根据当前的帧所在时刻与动画播放的总时间求出时间的流逝的百分比,再通过插值器计算出当前属性值改变的百分比,后用此值通过估值器计算出当前的属性改变后的确定的值是多少并通过set
方法对属性赋值。
故属性动画要求对象的该属性有set
方法(必须有)和get
方法(可选)。
自定义插值器和估值器
我们可以自定义插值器和估值器,来实现自己想要的动画效果。实现方式也很简单。
因为插值器和估值器都是一个接口,且内部都只有一个方法,所以我们只需要派生一个类并实现接口就可以了,然后就可以做出千奇百怪的动画效果了。即:
- 自定义插值器需要实现
Interpolator
或者TimeInterpolator
接口 - 自定义估值器需要实现
TypeEvaluator
接口。