Сделать продолжительность анимации ObjectAnimator независимой от настройки масштаба продолжительности глобального аниматора в настройках разработчика

Как вы можете сделать ObjectAnimator независимым от настройки параметров разработчика "Шкала продолжительности аниматора", когда постоянная и неизменяемая скорость имеет решающее значение?

2 ответа

Решение

Пришлось использовать скрытый API для доступа к setDurationScale метод на ValueAnimator объект.

Я заметил, что нет явного ответа на это. Вы можете сделать это, вызвав скрытый 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.
  }
}

Для получения более подробной информации вы можете проверить это сообщение в блоге: https://arpytoth.com/2016/12/20/android-objectanimator-independent-of-global-animator-duration/

Если вы не хотите связываться с setDurationScale, просто сделайте это

//in activity, kotlin
val animScale = Settings.Global.getFloat(this.contentResolver, Settings.Global.ANIMATOR_DURATION_SCALE, 1f)
animator.setDuration((timeInMs/animScale).toLong())
Другие вопросы по тегам