Android中SetDuration()使用问题:如何屏蔽动画缩放影响?
如何屏蔽Android开发者选项中Animator Duration Scale对动画的影响
嘿,这个问题我之前也踩过坑!开发者选项里的Animator duration scale会给默认的ViewPropertyAnimator(就是你用image.animate()创建的动画)的时长乘上对应的缩放系数,所以设为x5时,你的200ms动画实际会跑1000ms,自然就慢了。要绕过这个限制,有几个靠谱的办法:
方法一:计算抵消缩放后的实际时长(推荐)
系统提供了ValueAnimator.getDurationScale()方法来获取当前的动画缩放系数,我们只需要把目标时长除以这个系数,再设置给动画,就能让实际运行时长保持你想要的数值:
// 获取当前系统的动画缩放系数 float animatorScale = ValueAnimator.getDurationScale(); // 你期望的动画时长(不受缩放影响) long targetDuration = 200; // 计算抵消缩放后的实际时长 long actualDuration = (long) (targetDuration / animatorScale); // 应用到你的动画上 image.animate().alpha(1).setDuration(actualDuration);
原理很简单:系统会自动把你设置的actualDuration乘以animatorScale,所以(200 / 5) *5 =200,最终动画还是会按200ms跑完,不管缩放是x1还是x5。
方法二:直接使用ObjectAnimator替代ViewPropertyAnimator
ObjectAnimator同样受系统缩放影响,但我们可以用同样的计算方式调整时长:
ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(image, "alpha", 0f, 1f); float scale = ValueAnimator.getDurationScale(); // 同样计算抵消缩放后的时长 alphaAnimator.setDuration((long) (200 / scale)); alphaAnimator.start();
这种方式和方法一本质一样,只是换了动画的创建方式,适合需要更精细控制动画的场景。
方法三:强制修改全局动画缩放(不推荐)
如果你想让所有动画都不受系统缩放影响,可以通过反射修改ValueAnimator的私有静态字段sDurationScale,强制把缩放设为1:
try { Field durationScaleField = ValueAnimator.class.getDeclaredField("sDurationScale"); durationScaleField.setAccessible(true); durationScaleField.set(null, 1f); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); }
⚠️ 注意:这个方法属于hack手段,依赖Android的私有API,不同版本可能会有兼容性问题,甚至在某些机型上会失效,所以除非万不得已,不建议使用。
内容的提问来源于stack exchange,提问作者SaeeD
相关产品推荐
相关产品推荐

