shareinterpolator属性在android xml动画中无实际作用——它已被废弃,xml解析器完全忽略该属性,子动画必须显式配置相同插值器引用才能共用。

animation-set 的 shareInterpolator 属性到底有没有用
没用。在 Android XML 动画中,shareInterpolator 是个被废弃且实际不生效的属性——它只存在于旧版文档和部分 IDE 的自动补全里,但无论设为 true 还是 false,系统都不会按预期共享插值器。
根本原因:从 API 11(Honeycomb)开始,AnimationSet 的行为已改为「子动画各自持有独立插值器」,XML 解析器压根不读取 shareInterpolator;即使你写了,也相当于没写。
常见错误现象:
– 写了 shareInterpolator="true",但 alpha 和 translate 动画仍按各自定义的插值器运行
– 删掉所有子动画的 android:interpolator,只在 set 上设一个,结果动画完全不执行(因为父级插值器不向下透传)
怎么让多个动画共用同一个插值器(XML 方式)
必须显式给每个子动画节点单独配置相同的插值器引用,没有捷径。Android 不支持“继承式”插值器分发。
- 用
@android:anim/accelerate_decelerate_interpolator这类系统内置资源,确保路径一致 - 自定义插值器需提前定义在
res/anim/下(如res/anim/my_ease_in_out.xml),然后所有子动画都引用@anim/my_ease_in_out - 避免混用不同写法:比如一个用
@android:anim/linear_interpolator,另一个用@android:interpolator/linear(后者在低版本会崩溃)
示例:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha android:fromAlpha="0.0" android:toAlpha="1.0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator" />
<translate android:fromXDelta="0" android:toXDelta="100"
android:interpolator="@android:anim/accelerate_decelerate_interpolator" />
</set>
Java/Kotlin 代码里 setShareInterpolator(true) 为什么有时像有效果
那是因为你在代码中调用了 AnimationSet.setShareInterpolator(true),但这仅对「后续通过 addAnimation() 动态添加的动画」起作用——前提是这些动画**本身没设置插值器**。一旦子动画自己设置了 setInterpolator(...),就彻底覆盖掉共享逻辑。
关键细节:
-
setShareInterpolator(true)不影响 XML 加载进来的动画(它们的插值器已在解析时固化) - 动态添加时,若子动画构造后未调用
setInterpolator(),它才会用AnimationSet当前持有的插值器 - 这个共享行为只发生在运行时,和 XML 的
shareInterpolator属性无任何关系
兼容性与性能注意点
老项目如果还在用 Animation(非 Animator),插值器复用本身不带来性能提升——每个动画实例仍会创建自己的插值器对象,只是引用同一份配置数据。
真正要注意的是:
- Android 4.0+ 系统对插值器资源路径校验变严,错写成
@interpolator/xxx(缺android:前缀)会导致Resources$NotFoundException - 自定义插值器类若含状态(如缓存计算结果),被多个动画共用时可能引发竞态——务必保证线程安全或无状态
- 迁移到
ValueAnimator或ViewPropertyAnimator后,插值器共享逻辑完全不同,XML 配置完全失效
最易被忽略的一点:XML 动画里看似「省事」地删掉子动画的 android:interpolator,指望靠父 set 统一控制,结果什么插值器都没生效,默认回退到 LinearInterpolator,动效节奏全乱。










