上一篇android动画(二)我们介绍了属性动画的基本操作,介绍了ObjectAnimator、ValueAnimator、AnimatorSet等动画的操作的使用,顺便介绍了对于view的ViewProperty动画。
TypeEvaluator
上一篇我们遗漏了ofObject,主要是涉及到TypeEvaluator的使用,该类主要是如何从初始值过渡到结束值。
我们知道ofInt、ofFloat内部就使用的IntEvaluator和FloatEvaluator,源码如下
|
|
源码很简单,第一个参数fraction表示动画的进度,后面两个一个是初始值,一个是结束值,逻辑代码比较简单就是初始值加上进度乘以结束值减初始值。
那么我们在使用ofObject时需要自己实现一个TypeEvaluator。
下面我们举个例子说明,比如我们需要改变textview字体的颜色
然后我们便可以使用ofObject设置动画了
当然在api版本21中我们可以使用ofArgb()
或者
我们知道ofArgb内部使用的是ArgbEvaluator,发现其内部源码就是我们写的ColorEvaluator(当然这里是我拷贝的人家的代码)。因此我们便实现通过TypeEvaluator实现一些复杂的动画,详情可以参考郭霖大神相关的文章。
TimeInterpolate
插值器我们在android动画(一)补间动画中有简单的介绍系统的自带插值器,它主要用于控制动画的变化速率类似于物理上加速度,系统默认插值器是AccelerateDecelerateInterpolator,是中间较快,两端较慢,也就是先加速或减速。
查看源码我们发现AccelerateDecelerateInterpolator继承BaseInterpolator,BaseInterpolator则是实现Interpolator,Interpolator继承了TimeInterpolator。
接口很简单只有一个getInterpolation,参数是float返回一个float,input这个值随动画的运行不断变化,不过它的范围是0-1,也就是初值0,终值1,匀速递增。在TypeEvaluator曾有个表示动画的进度fraction参数,其实它就是这里的返回值。
android自带了一个LinearInterpolator,我们查看他的源码发现
它没有做任何的处理直接返回了input,也就是input与fraction值是相同的。因此动画便做匀速运动。对于AccelerateDecelerateInterpolator则返回的是一个余弦函数
对三角函数有一定了解的就会知道是cos函数在[π,2π]的一段,大家观看函数图像就明白了 。
AccelerateInterpolator是指数函数
当然我们也可以同理分析其他的插值器,如果系统自带的满足不了我们的要求,我们可以自定义插值器,重写getInterpolation便可以了。
最后
本期作为android动画的最后一期介绍了TypeEvaluator和TimeInterpolate相关的内容,这部分算是android动画的高级部分,通过自定义完成我们现实项目中需求。