You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中ObjectAnimator执行速度为设置duration两倍如何解决

核心原因

这个问题90%以上的概率是设备的系统动画全局缩放配置导致的:

  • Android 开发者选项中提供了「动画时长缩放」的全局控制项,所有继承自Animator的动画(包括你用的ObjectAnimator)实际执行时长都会和这个系数相乘:实际时长 = 代码配置的duration * 全局缩放系数
  • 如果这个系数被设置为0.5x,你设置的3000ms就会被缩放为1500ms,和你日志输出的1518ms完全匹配。

其他排查方向

如果确认全局缩放系数为1x,再检查这两种可能性:

  1. 后续代码是否意外覆盖了objectAnim的duration属性,或者给动画设置了大于1的playbackSpeed播放速度参数
  2. 动画被中途打断(比如对应View被从父布局移除、页面提前销毁、其他代码调用了clearAnimation等操作),这种场景下doOnEnd也会被触发,会导致你统计的耗时比实际设置的短,可以加doOnCancel回调确认是否属于这种情况。

验证方法

你可以用这段代码直接获取当前设备的动画缩放系数,确认配置是否符合预期:

val animScale = Settings.Global.getFloat(contentResolver, Settings.Global.ANIMATOR_DURATION_SCALE, 1.0f)
Log.d("AnimDebug", "系统动画缩放系数:$animScale")

修复方案

  1. 本地调试场景:直接进入设备「设置-开发者选项」,把「动画时长缩放」调整为1x即可恢复正常。
  2. 线上强制固定时长场景:
    • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:06:04