使 ObjectAnimator 动画持续时间独立于开发人员选项中的全局动画持续时间比例设置
Make ObjectAnimator animation duration independent of global animator duration scale setting in developer options
当恒定且不可修改的速度至关重要时,如何使 ObjectAnimator 独立于 "Animator duration scale" 开发人员选项设置?
必须使用隐藏 API 来访问 ValueAnimator
对象上的 setDurationScale
方法。
我注意到没有明确的答案。您可以通过反射调用隐藏的 API 来做到这一点:
// Get duration scale from the global settings.
float durationScale = Settings.Global.getFloat(context.getContentResolver(),
Settings.Global.ANIMATOR_DURATION_SCALE, 0);
// If global duration scale is not 1 (default), try to override it
// for the current application.
if (durationScale != 1) {
try {
ValueAnimator.class.getMethod("setDurationScale", float.class).invoke(null, 1f);
durationScale = 1f;
} catch (Throwable t) {
// It means something bad happened, and animations are still
// altered by the global settings. You should warn the user and
// exit application.
}
}
有关详细信息,您可以查看此博客 post:https://arpytoth.com/2016/12/20/android-objectanimator-independent-of-global-animator-duration/
如果你不想弄乱 setDuration Scale,就这样做
//in activity, kotlin
val animScale = Settings.Global.getFloat(this.contentResolver, Settings.Global.ANIMATOR_DURATION_SCALE, 1f)
animator.setDuration((timeInMs/animScale).toLong())
当恒定且不可修改的速度至关重要时,如何使 ObjectAnimator 独立于 "Animator duration scale" 开发人员选项设置?
必须使用隐藏 API 来访问 ValueAnimator
对象上的 setDurationScale
方法。
我注意到没有明确的答案。您可以通过反射调用隐藏的 API 来做到这一点:
// Get duration scale from the global settings.
float durationScale = Settings.Global.getFloat(context.getContentResolver(),
Settings.Global.ANIMATOR_DURATION_SCALE, 0);
// If global duration scale is not 1 (default), try to override it
// for the current application.
if (durationScale != 1) {
try {
ValueAnimator.class.getMethod("setDurationScale", float.class).invoke(null, 1f);
durationScale = 1f;
} catch (Throwable t) {
// It means something bad happened, and animations are still
// altered by the global settings. You should warn the user and
// exit application.
}
}
有关详细信息,您可以查看此博客 post:https://arpytoth.com/2016/12/20/android-objectanimator-independent-of-global-animator-duration/
如果你不想弄乱 setDuration Scale,就这样做
//in activity, kotlin
val animScale = Settings.Global.getFloat(this.contentResolver, Settings.Global.ANIMATOR_DURATION_SCALE, 1f)
animator.setDuration((timeInMs/animScale).toLong())