Android animation interpolator XML插值器控制动画速度

1次阅读

interpolator是将动画进度t∈[0,1]映射为另一值f(t)∈[0,1]的时间函数,只控制时间节奏而非位移/颜色等属性,xml中通过android:interpolator引用预置或自定义实例。

Android animation interpolator XML插值器控制动画速度

animation interpolator 是什么,不是“动画效果”

它只管时间映射,不管位移或颜色变化——Interpolator 把 0~1 的动画进度(t)转成另一个 0~1 值(f(t)),系统再用这个值去算当前位置。你改的是“时间怎么走”,不是“物体怎么动”。

XML 里写的 android:interpolator 只是引用一个预置或自定义的 Interpolator 实例,背后还是 Java/kotlin 对象在干活。

XML 中怎么写常见的 interpolator

直接写资源路径,别拼错名字;系统内置的都放在 @android:anim/ 下,自定义的得自己定义好再引用。

  • @android:anim/accelerate_decelerate_interpolator:先慢后快再慢,适合大多数平滑过渡
  • @android:anim/linear_interpolator:匀速,常被误认为“没效果”,其实只是速度不变
  • @android:anim/accelerate_interpolator:越来越快,适合弹出类动画
  • 自定义 XML 插值器(比如 @anim/my_bounce_interpolator)必须放在 res/anim/ 下,且根节点是 <bounceinterpolator></bounceinterpolator><pathinterpolator></pathinterpolator>

错误写法:@anim/accelerate_decelerate_interpolator(少写了 android: 前缀)→ 运行时报 ResourceNotFoundException

PathInterpolator 在 XML 里怎么用才不崩

PathInterpolator 允许用贝塞尔曲线控制节奏,但 XML 里只能写两组控制点(即 cubic Bezier),不能写更多点,也不能写 moveTolineTo

正确写法示例(放在 res/anim/path_fast_in_slow_out.xml):

<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"     android:controlX1="0.4"     android:controlY1="0.0"     android:controlX2="0.2"     android:controlY2="1.0" />

常见坑:

  • 四个值必须全在 0~1 范围内,超出会直接 crash(IllegalArgumentException
  • controlX1 必须 controlX2 必须 > 0,否则曲线非法
  • 不要试图在 ValueAnimator 的 XML 里用 <pathinterpolator></pathinterpolator> —— 它只支持在 <set></set><objectanimator></objectanimator>android:interpolator 属性中引用

Interpolator 和动画时长、重复的关系

它完全独立于 android:durationandroid:repeatMode。同一个插值器,在 100ms 和 1000ms 动画里,形状一样,只是被“拉伸”了时间轴。

但注意:如果动画设了 android:repeatCount="infinite",每次循环都重新走一遍插值曲线——不是连续跑完一条长曲线,而是反复执行同一段 f(t) 映射。

性能上基本无影响,所有系统内置插值器都是纯数学计算,没有对象分配;但自定义 PathInterpolator 如果路径太复杂(虽然 XML 不支持),或你在代码里 new 出一匿名 Interpolator,就可能触发 GC。

最容易被忽略的一点:插值器不改变动画是否“可中断”。哪怕用了 decelerate_interpolator,调 cancel() 依然立刻停,不会缓停——那是你要自己监听 AnimatorUpdateListener 去做的。

text=ZqhQzanResources