Android animator与animation区别 属性动画XML配置指南

1次阅读

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

Android animator与animation区别 属性动画XML配置指南

animator 和 animation 在 Android 里根本不是一回事

别被名字骗了:animator 是属性动画(Property Animation)体系,animation 是老式视图动画(View Animation),二者底层机制、作用对象、扩展能力完全不同。用错地方轻则动不了,重则在 ViewGroup 里触发 IllegalStateException 或静默失败。

XML 里写属性动画必须放 res/animator/,不是 res/anim/

这是最常踩的坑:把 ValueAnimatorObjectAnimator 的 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()

ObjectAnimatorandroid:propertyName 必须可读可写

属性动画不是“模拟”变化,而是真调用 setter/getter。比如想动 translationX,系统会找 setTranslationX(Float)getTranslationX();如果目标 View 没有对应 setter(如自定义 View 忘了加 setXXX),动画就卡在初始值不动,也不报错。

  • 常见合法属性:alphatranslationXrotationscaleY
  • 不能直接 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) 配合手动位移补偿 —— 这块没银弹,得看底线版本定方案。

text=ZqhQzanResources