Android属性动画 - ValueAnimator总结
最近开发Android App时学习了 ValueAnimator 类的使用,在这做一个归纳总结(PS:这是我的第一篇博客,不足、不正确之处请见谅~)
ValueAnimator
类用于完成属性动画的计时、值的计算,但它不会对要添加动画的对象和属性应用这些值。因此必须监听由 ValueAnimator
计算的值的更新情况,并使用您自己的逻辑修改要添加动画的对象。
使用:
ValueAnimator
可以对int、float、颜色以及自定义类型的数值添加动画- 用
ValueAnimator
的工厂方法ofFloat()
、ofInt()
、ofObject()
等创建对象,方法的参数指定动画的路径,例如ofFloat(0f, 100f, 50f)
就是指定动画的值从 0f 开始,经过 100f ,最后到 50f 结束;当然也可以通过new ValueAnimator()
创建对象,再用setFloatValues()
指定动画路径(ofFloat()
源码就是这么干的) setDuration()
指定动画时长;若动画运行中setDuration()
动画会继续运行且剩余运行时长 = 新时长 - 已运行时长
,如果已运行时长大于新时长则动画进度直接跳到100%结束start()
启动动画;若动画正在运行或已经结束,再调用start()
可以从头重新开始运行动画setStartDelay()
指定动画在调用start()
之后延迟多长时间再开始运行setCurrentFraction()
修改动画进度;动画运行前setCurrentFraction()
会使动画一start()
就马上从指定进度开始运行,忽略设置的startDelay;动画运行中setCurrentFraction()
会使动画从指定进度继续运行setCurrentPlayTime()
效果与setCurrentFraction()
差不多,只不过前者是基于动画总时长计算并设置新进度(源码里setCurrentPlayTime()
就是去调用setCurrentFraction()
实现的);同样,动画运行前setCurrentPlayTime()
会使动画一start()
就马上从指定播放时间开始运行,忽略设置的startDelay;动画运行中setCurrentPlayTime()
会使动画从指定播放时间继续运行setInterpolator()
设置动画的插值器,默认是AccelerateDecelerateInterpolator
(开始慢,中间快,结束慢),还有LinearInterpolator
(匀速)、AccelerateInterpolator
(开始慢,逐渐加速)、DecelerateInterpolator
(开始快,逐渐减速)等等,还可实现TimeInterpolator
接口来自定义插值器setEvaluator()
设置动画的Evaluator(可译为估值器),用于告知属性动画系统如何计算指定属性的值,有IntEvaluator
、FloatEvaluator
、ArgbEvaluator
(用于计算颜色属性的值),或实现TypeEvaluator
实现自定义EvaluatorsetFloatValues()
等方法修改动画路径;动画运行中setFloatValues()
不会打断动画,而是保持动画进度不变,从新路径中原动画进度的位置继续运行setRepeatCount()
指定动画重复次数,默认0(不重复),还可以指定INFINITE
(无限次重复)setRepeatMode()
指定动画重复方式,默认RESTART
(从头播放)、REVERSE
(反向播放)addListener()
监听onAnimationStart()
、onAnimationEnd()
、onAnimationCancel()
、onAnimationRepeat()
回调addUpdateListener()
监听onAnimationUpdate()
回调,这个最常用,用来监听ValueAnimator
当前计算出的值并应用到要添加动画的对象上,示例:
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float animatedValue = (float) animation.getAnimatedValue();
textView.setTranslationX(animatedValue);
}
});
addPauseListener()
监听onAnimationPause()
、onAnimationResume()
回调pause()
暂停动画;resume()
恢复动画cancel()
使动画在当前进度结束,并会收到onAnimationCancel()
与onAnimationEnd()
回调;end()
使动画直接跳至动画路径的终点结束(能收到终点处的onAnimationUpdate()
回调),并会收到onAnimationEnd()
回调isStarted
返回动画是否已经start()
,startDelay期间为true;isRunning()
返回动画是否正在运行,startDelay期间为false