Android中ObjectAnimator执行速度为设置duration两倍如何解决
核心原因
这个问题90%以上的概率是设备的系统动画全局缩放配置导致的:
- Android 开发者选项中提供了「动画时长缩放」的全局控制项,所有继承自
Animator的动画(包括你用的ObjectAnimator)实际执行时长都会和这个系数相乘:实际时长 = 代码配置的duration * 全局缩放系数 - 如果这个系数被设置为0.5x,你设置的3000ms就会被缩放为1500ms,和你日志输出的1518ms完全匹配。
其他排查方向
如果确认全局缩放系数为1x,再检查这两种可能性:
- 后续代码是否意外覆盖了
objectAnim的duration属性,或者给动画设置了大于1的playbackSpeed播放速度参数 - 动画被中途打断(比如对应View被从父布局移除、页面提前销毁、其他代码调用了
clearAnimation等操作),这种场景下doOnEnd也会被触发,会导致你统计的耗时比实际设置的短,可以加doOnCancel回调确认是否属于这种情况。
验证方法
你可以用这段代码直接获取当前设备的动画缩放系数,确认配置是否符合预期:
val animScale = Settings.Global.getFloat(contentResolver, Settings.Global.ANIMATOR_DURATION_SCALE, 1.0f) Log.d("AnimDebug", "系统动画缩放系数:$animScale")
修复方案
- 本地调试场景:直接进入设备「设置-开发者选项」,把「动画时长缩放」调整为1x即可恢复正常。
- 线上强制固定时长场景:
- targetSdk >= 31(Android 12)的版本,可以直接给动画单独设置缩放系数,不受全局配置影响:
// 写在createTranslateAnimation方法的apply块内 durationScale = 1f- 兼容低版本的话,可以通过反向计算的方式设置duration:
val animScale = Settings.Global.getFloat(contentResolver, Settings.Global.ANIMATOR_DURATION_SCALE, 1.0f) duration = (3000 / animScale).toLong()
内容的提问来源于stack exchange,提问作者Hayk Mkrtchyan
相关产品推荐
相关产品推荐

