Какова текущая, новая альтернатива ViewAnimator?

Фон

Я давно пользуюсь ViewAnimator/ ViewSwitcher.

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

Эта проблема

Когда я предложил добавить хорошую функцию расширения в репозиторий "android-ktx" ( здесь), мне сказали:

ViewAnimator не является API, который мы активно рекомендуем для анимации представлений. Он основан на старой системе анимации, и мы не хотим продвигать его использование в этой библиотеке.

Что я пробовал

Я просмотрел статьи ViewAnimator и ViewSwitcher, в том числе документы. Там не сказано, что он был заменен / устарел или что вместо него рекомендуется использовать что-то другое.

Вопросы

  1. Что заменило ViewAnimator? Он говорит о переходах?

  2. Каковы преимущества и недостатки по сравнению с ViewAnimator?

  3. Учитывая ViewAnimator с некоторыми представлениями, как он будет преобразован в более новое решение, включая переключение между состояниями?

3 ответа

Решение

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

Для реализации кажется, что нужно использовать 2 одинаковых макета с одинаковыми идентификаторами для каждого вида, а затем вы можете переключаться между фазами, как таковые:

class MainActivity : AppCompatActivity() {
    private var show = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.circuit)
        backgroundImage.setOnClickListener {
            if(show)
                hideComponents() // if the animation is shown, we hide back the views
            else
                showComponents() // if the animation is NOT shown, we animate the views
        }
    }

    private fun showComponents(){
        show = true
        val constraintSet = ConstraintSet()
        constraintSet.clone(this, R.layout.circuit_detail)
        val transition = ChangeBounds()
        transition.interpolator = AnticipateOvershootInterpolator(1.0f)
        transition.duration = 1200
        TransitionManager.beginDelayedTransition(constraint, transition)
        constraintSet.applyTo(constraint)
    }

    private fun hideComponents(){
        show = false
        val constraintSet = ConstraintSet()
        constraintSet.clone(this, R.layout.circuit)
        val transition = ChangeBounds()
        transition.interpolator = AnticipateOvershootInterpolator(1.0f)
        transition.duration = 1200
        TransitionManager.beginDelayedTransition(constraint, transition)
        constraintSet.applyTo(constraint)
    }
}

Я предполагаю, что означает Romain Guy, это то, что ViewAnimator использования Animation API, тогда как более новый API считается Animator, См. Раздел "Чем анимация свойств отличается от анимации представления" в документации, где упоминаются преимущества и недостатки каждого API-интерфейса, а также сценарии использования:

Система анимации представления предоставляет возможность только анимировать объекты View, поэтому, если вы хотите анимировать объекты, не являющиеся View, вы должны реализовать собственный код для этого. Система анимации вида также ограничена тем фактом, что она позволяет анимировать только несколько аспектов объекта View, таких как, например, масштабирование и вращение View, но не цвет фона.

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

С помощью системы анимации свойств эти ограничения полностью удаляются, и вы можете анимировать любое свойство любого объекта (представления и не-представления), а сам объект фактически изменяется. Система анимации свойств также более надежна в том, как она выполняет анимацию. На высоком уровне вы назначаете аниматоры для свойств, которые вы хотите анимировать, таких как цвет, положение или размер, и можете определять аспекты анимации, такие как интерполяция и синхронизация нескольких аниматоров.

Однако система анимации вида требует меньше времени для настройки и требует меньше кода для записи. Если просмотр анимации выполняет все, что вам нужно сделать, или если ваш существующий код уже работает так, как вы хотите, нет необходимости использовать систему анимации свойств. Также может иметь смысл использовать обе системы анимации для разных ситуаций, если возникает вариант использования.

Там нет простой способ "конвертировать ViewAnimator использовать более новый подход ", хотя, потому что он внутренне использует Animation API. Как упомянуто в документации: "если анимация представления выполняет все, что вам нужно, или если ваш существующий код уже работает так, как вы хотите, нет необходимости использовать систему анимации свойств", поэтому ViewAnimator не считается устаревшим

Попробуйте использовать AdaprterViewAnimator. AdaprterViewAnimator требуется адаптер для дочерних представлений, так что это может быть несколько сложнее в использовании, чем ViewAnimator, но это потребовало методов от ViewAnimator класс, такой как showNext(), setInAnimation(ObjectAminator) а также setOutAnimation(ObjectAminator), Да, вы должны вручную переписать всю анимацию в ObjectAnimator.

Другие вопросы по тегам