Android属性动画-ValueAnimator

📅 2026/7/14 13:44:13 👁️ 阅读次数 📝 编程学习
Android属性动画-ValueAnimator

ValueAnimator 类用于产生属性动画值。它并不会把值应用到要添加动画的对象上,因此我们需要自行监听由它产生的值,然后根据自己的需求把值应用到要添加动画的对象上。ValueAnimator 可以对int、float、颜色以及自定义类型的值进行计算。

使用:

  • 用 ValueAnimator 的工厂方法ofFloat()ofInt()ofObject()等创建对象,方法的参数指定动画的路径。例如ofFloat(0f, 100f, 50f)就是指定动画的值从0f开始,经过100f,最后到50f结束;当然也可以通过new ValueAnimator()创建对象,再用setFloatValues()指定动画路径(ofFloat()源码就是这么干的)

  • setDuration()指定动画时长;若在动画运行中调用setDuration(),动画会继续运行且剩余运行时长 = 新时长 - 已运行时长,如果已运行时长大于新时长则动画结束

  • 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(可译为"求值器"),用于告知属性动画系统如何计算指定属性的值,有IntEvaluatorFloatEvaluatorArgbEvaluator(用于计算颜色属性的值),或通过实现TypeEvaluator来自定义Evaluator

  • setFloatValues()等方法修改动画路径;动画运行中setFloatValues()不会打断动画,而是保持动画进度不变,从新路径中原动画进度的位置继续运行

  • setRepeatCount()指定动画重复次数,默认0(不重复),还可以指定INFINITE(无限次重复)

  • setRepeatMode()指定动画重复方式,默认RESTART(从头播放),还可以指定REVERSE(反向播放)

  • addListener()监听onAnimationStart()onAnimationEnd()onAnimationCancel()onAnimationRepeat()回调

  • addUpdateListener()监听onAnimationUpdate()回调,这个最常用,用来监听ValueAnimator当前计算出的值并应用到要添加动画的对象上,示例:

    animator.addUpdateListener(newValueAnimator.AnimatorUpdateListener(){@OverridepublicvoidonAnimationUpdate(ValueAnimatoranimation){floatanimatedValue=(float)animation.getAnimatedValue();textView.setTranslationX(animatedValue);}});
  • addPauseListener()监听onAnimationPause()onAnimationResume()回调

  • pause()暂停动画;resume()恢复动画

  • cancel()使动画在当前进度结束,并会收到onAnimationCancel()回调;end()使动画直接跳至动画路径的终点结束(能收到终点处的onAnimationUpdate()回调);无论用cancel()还是end()结束动画,都会收到onAnimationEnd()回调

  • isStarted返回动画是否已经start(),startDelay期间为true;isRunning()返回动画是否正在运行,startDelay期间为false