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

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),不能写更多点,也不能写 moveTo 或 lineTo。
正确写法示例(放在 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:duration 和 android:repeatMode。同一个插值器,在 100ms 和 1000ms 动画里,形状一样,只是被“拉伸”了时间轴。
但注意:如果动画设了 android:repeatCount="infinite",每次循环都重新走一遍插值曲线——不是连续跑完一条长曲线,而是反复执行同一段 f(t) 映射。
性能上基本无影响,所有系统内置插值器都是纯数学计算,没有对象分配;但自定义 PathInterpolator 如果路径太复杂(虽然 XML 不支持),或你在代码里 new 出一堆匿名 Interpolator,就可能触发 GC。
最容易被忽略的一点:插值器不改变动画是否“可中断”。哪怕用了 decelerate_interpolator,调 cancel() 依然立刻停,不会缓停——那是你要自己监听 AnimatorUpdateListener 去做的。