Поддержка AnimatedVectorDrawable < 24

#android #android-studio #android-vectordrawable #animatedvectordrawable

#Android #android-studio #android-vectordrawable #animatedvectordrawable

Вопрос:

У меня есть анимированный векторный ресурс для рисования в моей папке для рисования. Я использую следующий код, чтобы запустить его при нажатии кнопки

 val myVectorDrawable = ResourcesCompat.getDrawable(
            resources,
            R.drawable.animation,
            theme
        )


        button.setOnClickListener {
            image.setImageDrawable(null)
            image.setImageDrawable(myVectorDrawable)

            val drawable = image.drawable

            if (drawable is AnimatedVectorDrawableCompat) {
                drawable.start()
            } else if (drawable is AnimatedVectorDrawable)
                drawable.start()

        }
  

Это работает отлично, если на устройстве установлена версия Android> 24 и в противном случае происходит сбой. Мне нужно поддерживать устройства Android с минимальным SDK 21.

Мои вопросы

  1. Как сделать так, чтобы мой код поддерживал устройства 21 до 24 .
  2. есть ли лучший способ запустить AnimatedVectorDrawable анимацию

Ответ №1:

Если вы знаете, что используете анимированный вектор, его можно использовать AnimatedVectorDrawableCompat.create() для создания AnimatedVectorDrawableCompat экземпляра, доступного на всех устройствах API 14 :

 val drawable = AnimatedVectorDrawableCompat.create(
    this, // your Context
    R.drawable.animation)

button.setOnClickListener {
    image.setImageDrawable(null)
    image.setImageDrawable(drawable)

    drawable.start()
}
  

Однако, если вам нужен более общий подход, вы должны вместо этого использовать AppCompatResources.getDrawable() вместо ResourcesCompat.getDrawable() as, который должным образом учитывает VectorDrawableCompat классы , AnimatedVectorDrawableCompat , и AnimatedStateListDrawableCompat таким образом, чтобы он был совместим со всеми уровнями API:

 val drawable = AppCompatResources.getDrawable(
    this, // your Context
    R.drawable.animation)

button.setOnClickListener {
    image.setImageDrawable(null)
    image.setImageDrawable(drawable)

    if (drawable is Animatable) {
        drawable.start()
    }
}
  

Ответ №2:

Вы настроили свою сборку на использование реализации библиотеки поддержки?

https://developer.android.com/guide/topics/graphics/vector-drawable-resources#vector-drawables-backward-solution

 android {
  defaultConfig {
    vectorDrawables.useSupportLibrary = true
  }
}
  

Без этого система сборки будет создавать резервные (невекторные) ресурсы для более низких версий SDK вместо использования реализации поддержки.

Комментарии:

1. @ianhanniballake правильно, я бы просто посоветовал вам проверить, что это установлено, чтобы гарантировать, что другие случаи VectorDrawable (Compat) также работают должным образом.

2. Спасибо за комментарий. Он уже был добавлен, но по какой-то причине мой код не работал для < 24, но теперь он работает отлично.