How can you make ObjectAnimator independent of the "Animator duration scale" developer options setting when constant and unmodifiable speed is critical?
Asked
Active
Viewed 2,765 times
3 Answers
13
I noticed there is no explicit answer for this. You can do this by calling the hidden API via reflection:
// 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.
}
}
For more details you can check this blog post: https://arpytoth.com/2016/12/20/android-objectanimator-independent-of-global-animator-duration/

James Fenn
- 109
- 1
- 14

Arpad Toth
- 231
- 2
- 6
-
Very nice this answer is still here as the linked domain has gone entirely offline and the Internet Archive doesn't have a copy of it. – i336_ Oct 02 '21 at 12:21
2
If you dont want to mess with setDurationScale, just do this
//in activity, kotlin
val animScale = Settings.Global.getFloat(this.contentResolver, Settings.Global.ANIMATOR_DURATION_SCALE, 1f)
animator.setDuration((timeInMs/animScale).toLong())

ueen
- 692
- 3
- 9
- 21
-
4This doesn't really solve the issue entirely as the user can turn off the animation, which sets the scale to 0. This would then fail. – Felipe Ribeiro R. Magalhaes Oct 06 '20 at 11:34
0
Had to use hidden API to access the setDurationScale
method on the ValueAnimator
object.

user1612686
- 168
- 2
- 10