scale动画不生效主因是pivotx/pivoty单位错误:未加%被解析为像素导致锚点偏移;alpha动画失效因visibility非visible或父级alpha覆盖;rotate动画角度基于原始状态而非当前rotation;动画结束回弹需同时设fillafter="true"和fillenabled="true"。

animation.xml 里 scale 动画不生效?检查 android:pivotX 和 android:pivotY 的单位
补间动画里 scale 看似简单,但多数“没反应”或“偏移出界”的问题,都卡在锚点设置上。android:pivotX 和 android:pivotY 默认值是 50%(相对自身宽高),但如果你写成 50(没带 %),系统就按像素理解——小尺寸 View 下可能直接锚到左上角外侧,导致缩放完全不可见。
- 要以自身中心为缩放点:明确写
android:pivotX="50%"、android:pivotY="50%" - 要以屏幕左上角为基准:用
android:pivotX="0"+android:pivotY="0"(单位是像素,不是百分比) - 注意:
%是相对于 View 自身,%p才是相对于父容器——但scale不支持%p,写了也无效
alpha 动画闪退或黑屏?确认 View 是否被 visibility 或 alpha 层级覆盖
alpha 动画只是改变绘制透明度,不改变 View 的实际可见性状态。如果动画前 View 的 visibility 是 GONE,或者父布局设置了 android:alpha="0",那 alpha 动画根本不会启动——系统认为它“不可见”,连绘制流程都跳过了。
- 动画前确保 View 的
visibility是VISIBLE(别依赖 layout 中的默认值,代码里显式设一次更稳) - 检查父级 View 是否有
android:alpha或setAlpha()调用,这类设置会叠加影响子 View 最终透明度 - Android 4.0+ 上,
alpha动画会触发硬件加速渲染;若 View 含自定义 onDraw 且未适配,可能出现闪烁或黑块
rotate 动画转歪了?fromDegrees 和 toDegrees 是绝对角度,不是增量
很多人以为 fromDegrees="0" → toDegrees="90" 是“顺时针转 90°”,这没错;但若 View 原本已通过 setRotation(45) 旋转过,再跑这个动画,结果是最终停在 90°(不是 45+90=135°)。补间动画始终基于 View 的原始未动画状态计算起始角度。
-
fromDegrees指的是动画开始时 View 应该呈现的角度(0 表示未旋转),和当前实际 rotation 值无关 - 想实现“在当前角度基础上再转”,得先读
view.getRotation(),再用代码动态构造RotateAnimation,XML 无法做到 - 负角度合法:
fromDegrees="0"→toDegrees="-90"就是逆时针转 90°
动画执行完 View 回弹?必须手动调用 fillAfter="true" 并设 android:fillEnabled="true"
XML 补间动画默认不保留结束状态。动画一停,View 立刻“弹回”原始位置/大小/角度——这不是 bug,是设计如此。只靠 fillAfter="true" 还不够,Android 3.0+ 要求同时开启 fillEnabled 才生效。
- 两个属性必须一起写:
android:fillAfter="true"+android:fillEnabled="true" - 仅设
fillAfter在 Android 4.0+ 会被忽略,动画照样回弹 - 注意:
fillAfter只影响视觉状态,View 的实际 layout 参数(如getLeft())不会变,点击热区仍按原始位置算
真正麻烦的地方在于:XML 动画的 fill 效果是“假持久化”——它只改绘制矩阵,不改 View 状态。如果后续有 layout 重排、横竖屏切换或 ViewGroup 重 measure,那些 fill 效果大概率消失。需要长期保持变形,得用属性动画(ObjectAnimator)或手动同步状态。










