@UBERS

Как исправить лагающую анимацию?

У меня есть Recycler View, который заполняет список элементами, при клике по которым, происходит анимация открытия описания к нажатому элементу, вот код разворачивания описания:
private fun expandView(expItem: View, expHeight: View, context: Context) {
            isAnim = true

            val initHeight = expItem.height
            expHeight.measure(
                View.MeasureSpec.makeMeasureSpec(expItem.width, View.MeasureSpec.EXACTLY),
                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
            )
            val targetHeight = initHeight + expHeight.measuredHeight

            val animator = ValueAnimator.ofInt(initHeight, targetHeight)
            animator.addUpdateListener { animation ->
                val value = animation.animatedValue as Int
                val layoutParams = expItem.layoutParams
                layoutParams.height = value
                expItem.layoutParams = layoutParams
            }
            animator.duration = 200

            animator.start()

            animator.addListener(object: AnimatorListenerAdapter() {
                override fun onAnimationEnd(animation: Animator) {
                    super.onAnimationEnd(animation)
                    isAnim = false
                    val animFadeIn = AnimationUtils.loadAnimation(context, R.anim.fade_in)
                    expHeight.startAnimation(animFadeIn)
                    expHeight.visibility = View.VISIBLE
                }
            })
        }

А вот код сворачивания, обратный процесс:
private fun collapseView(collItem: View, collHeight: View) {
            isAnim = true

            val initHeight = collItem.height
            collHeight.measure(
                View.MeasureSpec.makeMeasureSpec(collItem.width, View.MeasureSpec.EXACTLY),
                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
            )
            val targetHeight = initHeight - collHeight.measuredHeight

            val animator = ValueAnimator.ofInt(initHeight, targetHeight)
            animator.addUpdateListener { animation ->
                val value = animation.animatedValue as Int
                val layoutParams = collItem.layoutParams
                layoutParams.height = value
                collItem.layoutParams = layoutParams
            }
            animator.duration = 200

            animator.start()

            animator.addListener(object: AnimatorListenerAdapter() {
                override fun onAnimationEnd(animation: Animator) {
                    super.onAnimationEnd(animation)
                    isAnim = false
                }
            })
        }

Суть в том, что при нажатии в первый раз по элементу для разворачивания описания - анимация очень сильно лагает, около 4 - 8 кадров в секунду. После этого при повторном нажатии на элемент еще несколько раз анимация каждый раз начинает работать быстрее, лагов становится все меньше, а в конечном итоге (обычно через 8 - 15 повторений этого действия) анимация перестает лагать, и начинает работать как нужно, плавно разворачивая и сворачивая описание на его высоту (в описании текст, который может быть с разным количеством строк).
Насколько я понимаю, анимация через несколько проигрываний кэшируется и начинает подгружаться из памяти, не производя повторные вычисления. Но я склоняюсь к тому, что я скорее не прав, чем прав. Прошу помочь мне с этим вопросом, мне нужно, чтобы анимация работала с первого раза безукоризненно. Буду рад подмечанию моих ошибок.
  • Вопрос задан
  • 35 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы