animator 和 animation 在 android 中完全不同:前者是属性动画,作用于对象属性并调用 setter/getter,xml 必须放在 res/animator/;后者是视图动画,仅改变绘制效果,xml 放在 res/anim/。

animator 和 animation 在 Android 里根本不是一回事
别被名字骗了:animator 是属性动画(Property Animation)体系,animation 是老式视图动画(View Animation),二者底层机制、作用对象、扩展能力完全不同。用错地方轻则动不了,重则在 ViewGroup 里触发 IllegalStateException 或静默失败。
XML 里写属性动画必须放 res/animator/,不是 res/anim/
这是最常踩的坑:把 ValueAnimator 或 ObjectAnimator 的 XML 放进 res/anim/,编译不报错,但运行时调用 AnimatorInflater.loadAnimator() 会直接抛 Resources$NotFoundException —— 因为这个 API 只认 animator 目录。
-
res/animator/fade_in.xml:合法,可用AnimatorInflater.loadAnimator() -
res/anim/fade_in.xml:哪怕内容完全一样,也会加载失败 - 老式
AlphaAnimation等 XML 必须放res/anim/,用AnimationUtils.loadAnimation()
ObjectAnimator 的 android:propertyName 必须可读可写
属性动画不是“模拟”变化,而是真调用 setter/getter。比如想动 translationX,系统会找 setTranslationX(float) 和 getTranslationX();如果目标 View 没有对应 setter(如自定义 View 忘了加 setXXX),动画就卡在初始值不动,也不报错。
- 常见合法属性:
alpha、translationX、rotation、scaleY - 不能直接 anim
layout_width——View没有setLayoutWidth(),得靠ValueAnimator+ 手动requestLayout() - 自定义属性需配合
PropertyValuesHolder或在 Java/Kotlin 里显式声明Property
XML 动画无法动态改参数,别指望 runtime 调 setDuration()
从 XML 加载的 Animator 是只读配置,调 animator.setDuration(2000) 无效 —— 它只影响后续 start 前的设置,但 XML 已固化了所有值。真要动态控制,要么全代码写 ObjectAnimator.ofFloat(...),要么用 setStartDelay() 这类未被 XML 占用的接口。
- XML 中
android:duration="300"一旦写死,Java 层无法覆盖 - 想复用同一份 XML 但不同持续时间?只能复制一份改名,或改用代码构建
- 性能上,XML 解析比代码创建稍慢,但差异微乎其微,别过早优化
真正麻烦的是跨 SDK 版本兼容性:API 11+ 才支持 animator 目录和 ObjectAnimator,而 ViewPropertyAnimator(链式调用)又是 API 12+。如果项目还要支持 4.0 以下,这些 XML 根本没法用,得 fallback 到 Animation + setFillAfter(true) 配合手动位移补偿 —— 这块没银弹,得看底线版本定方案。










