startoffset单位是毫秒而非秒,xml中所有时间属性默认毫秒;嵌套set的startoffset递归累加;代码setstartoffset会覆盖xml值;常见失效源于动画复用、生命周期干扰或duration为0。

animation set 的 startOffset 是毫秒值,不是秒
很多人写 startOffset="1" 以为会延迟 1 秒,结果动画几乎立刻开始——因为单位是毫秒,1 毫秒基本感知不到。XML 中所有时间相关属性(duration、startOffset、repeatDelay)默认单位都是毫秒。
-
startOffset="1000"= 延迟 1 秒 -
startOffset="500"= 延迟 0.5 秒 - 别用小数,比如
startOffset="0.5",会直接解析失败或被截断为 0 - 如果父
set设了startOffset,子动画的startOffset是相对于父级开始时间计算的,不是相对于整个动画起始点
嵌套 set 时,startOffset 是叠加计算的
Android 动画系统对嵌套 set 的时间轴是递归累加的:每个 set 的 startOffset 会加到它内部所有子动画的起始时间上。
- 外层
set:startOffset="200" - 内层
set:startOffset="300" - 里面一个
alpha动画:startOffset="100" - 最终这个
alpha动画实际在全局第200 + 300 + 100 = 600毫秒开始 - 注意:如果某层
set设了android:shareInterpolator="false",不影响时间偏移逻辑,只影响插值器作用范围
startOffset 在 Java/Kotlin 代码中设置会覆盖 XML 值
如果你用 AnimationUtils.loadAnimation() 加载 XML,再调用 setStartOffset(),后者会完全覆盖 XML 里的 startOffset 值,包括嵌套层级中的所有偏移。
- XML 里写了
startOffset="100",代码又调anim.setStartOffset(500)→ 最终按 500ms 算 - 但代码没法单独改某个子动画的偏移,只能整体设;想精细控制,得放弃 XML,全用代码构造
AnimationSet - API 21+ 的
AnimatorSet(属性动画)不支持startDelay的 XML 嵌套叠加,那是另一套机制,别和Animation混用
常见错误:延迟没生效,其实是动画被提前 cancel 或 reset 了
看起来 startOffset 写对了,但动画就是不延迟播放——大概率不是时间设置问题,而是动画对象被复用或生命周期干扰了。
- Activity 重建、Fragment 重走
onCreateView时,如果重复startAnimation()同一个 Animation 实例,第二次会立即触发(Android 对已启动动画调 start 会强制 reset 并立即执行) - 在
View.setVisibility(GONE)后又设回VISIBLE,再 start 动画,也可能跳过延迟 - 检查 Logcat 是否有
AnimationUtils: Tried to start animation with no duration类错误,说明某子动画 duration=0,整个 set 时间轴可能异常
startOffset 本身,而在它被谁改过、被谁重置过、或者根本没走到播放那一步。










