外观
translation 动画和修改 margin 动画有什么不同?
标准回答
translationX / translationY 改变 View 的视觉位置,通常不需要为了每一帧移动重新计算整套布局。修改 margin 或宽高则可能改变父容器的排布需求,配合布局通知后更容易触发测量与布局工作。
例如让一个固定大小的图标平移,属性动画通常更直接;如果图标变大时,确实需要把旁边控件挤开,那就需要更新真实布局,不能只靠视觉缩放假装已经完成排版。
硬件加速可以复用部分绘制记录并更新渲染属性,但不能说所有属性动画都完全运行在 RenderThread。ValueAnimator 等常见动画回调通常仍需要主线程推进;哪些动画可由独立渲染时序驱动,要看具体 API 与实现。
传统补间动画主要改变显示变换,可能不改变实际布局属性和命中位置。属性动画则修改目标属性,但 translation 同样不等于重排兄弟节点。选择时要同时看视觉、交互与布局语义。
关键机制
- 布局边界与视觉位置需要区分,getLeft 与 getX 的含义可能不同。
- alpha、裁剪、模糊和图层缓存也有渲染与内存成本,不能把属性动画统称为零成本。
- 动画取消与重复启动要管理最终状态,防止旧回调覆盖新一轮状态。
通俗例子
工具栏图标只需滑入,优先考虑 translation;展开卡片需要下方内容下移,则需要真正的尺寸或布局变化。
追问与回答
开启硬件层一定更快吗?
不一定。硬件层可能复用一块已渲染内容,减少重复绘制,但需要额外显存或图形内存,内容频繁变化时还要不断更新。是否值得开启,要看动画期间内容是否稳定、图层大小和实际测量结果,不能对所有 View 长期开启。
易混淆点
主线程卡住时有些系统动画继续,并不能推出所有 View 属性动画都不会卡。
参考资料
内容来源
- Android 技术札记 · 原条目
view-animation