Как улучшить производительность анимации на Android? - PullRequest
0 голосов
/ 23 сентября 2019

Я анимирую изображение, изменяя его высоту с помощью ValueAnimator.Проблема в том, что иногда он немного запаздывает (не начинается плавно), хотя в 80% случаев он проходит довольно гладко.

В представлении изображения есть четыре других вида, ограниченных им, поэтому я тожеанимация их затухания с помощью ObjectAnimator по мере сворачивания изображения.

Я использую 2 AnimatorSet-s для их синхронизации.

Я пытался использовать TransitionManager другими способами, а также пытался игратьвокруг с собственниками аниматоров.Результат был таким же.

Попытался также установить типы слоев видов в LAYER_TYPE_HARDWARE и LAYER_TYPE_SOFTWARE.Тот же результат.

Я также думал, что использование двух AnimatorSet-ов могло бы замедлить анимацию, но я пытался удалить анимацию с замиранием, и иногда коллапс по-прежнему был медленным.

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

Это ConstraintLayout в NestedScrollView.Внутри ConstraintLayout имеет:

1) вложенный ConstraintLayout;

2) два RecyclerView-s;

3) included LinearLayout с 4-мя многократными исчезающими иout Views, то есть View.GONE к моменту запуска анимации;

4) CardView с вложенным LienarLayout, который CardView также является View.GONE;

5) 1 кнопка, 1 просмотр,5 TextView-s;

6) Мое дополнение к макету -> сворачивающийся фоновый ImageView, еще один маленький ImageView, 2 x TextView, TextInputLayout + TextInputEditText и кнопка.

Когда я пыталсяпри удалении материала анимация улучшается и становится на 100% плавной, когда я удаляю вложенные ConstraintLayout и RecyclerView-ы.

В действительности, единственное, что я могу придумать, это удалить вложенный ConstrainLayout и ограничить его.представления внутри него выглядят так же, как и раньше.

У кого-нибудь есть идеи о том, как улучшить производительность здесь?Имейте в виду, что я довольно ограничен в своих действиях, так как это не личное приложение.

Большое спасибо!

Укажите код ниже:

AnimatorSet().apply {
    playTogether {
        getCollapseAnimation(),
        getFadingViewsAnimatorSet()
    }
    start()
}

fun getCollapseAnimation(): ValueAnimator {
    return ValueAnimator.ofInt(imageView.measuredHeight, 0).apply {
        addUpdateListener {
            val params = imageView.layoutParams
            params.height = it.animatedValue as Int
            imageView.layoutParams = params
        }
        duration = 500
    }
}

fun getFadingViewsAnimatorSet(): AnimatorSet {
    val fadeAmim1 = ObjectAnimator.ofFloat(view1, View.ALPHA, 0f)
    val fadeAnim2 = ObjectAnimator.ofFloat(view2, View.ALPHA, 0f)
    val fadeAnim3 = ObjectAnimator.ofFloat(view3, View.ALPHA, 0f)
    val fadeAnim4 = ObjectAnimator.ofFloat(view4, View.ALPHA, 0f)
    return AnimatorSet().apply {
        playTogether(fadeAnim1, fadeAnim2, fadeAnim3, fadeAnim4)
        duration = 200
    }
}
...