Отладка Android ValueAnimator - PullRequest
       7

Отладка Android ValueAnimator

0 голосов
/ 23 января 2019

Я пытался создать анимацию свертывания / развертывания для моего CardView, используя функции расширения Kotlin и ValueAnimator. Вот код для моей анимации (функции расширения CardView):

fun CardView.collapse() {
    val content = findViewById<RecyclerView>(R.id.rv_content)
    val arrow = findViewById<ImageView>(R.id.contents_arrow)
    val currentHeight = content.layoutParams.height

    val rvAnimator = ValueAnimator.ofInt(currentHeight, 0).apply {
        addUpdateListener{ updatedAnimation ->
            val params = content.layoutParams
            params.height = updatedAnimation.animatedValue as Int
            content.layoutParams = params
        }
        duration = 1000
    }

    val arrowAnimator = ValueAnimator.ofFloat(00f, 180f).apply {
        addUpdateListener { updatedAnimation ->
            arrow.rotation = updatedAnimation.animatedValue as Float
        }

        duration = 1000
        startDelay = 250
    }

    AnimatorSet().apply {
        playTogether(rvAnimator, arrowAnimator)
        start()
    }

}

fun CardView.expand(maxHeight: Int) {
    val content = findViewById<RecyclerView>(R.id.rv_content)
    val arrow = findViewById<ImageView>(R.id.contents_arrow)

    val rvAnimator = ValueAnimator.ofInt(0, maxHeight).apply {
        addUpdateListener{updatedAnimation ->
            val params = content.layoutParams
            params.height = updatedAnimation.animatedValue as Int
            content.layoutParams = params
        }
        duration = 1000
    }

    val arrowAnimator = ValueAnimator.ofFloat(180f, 0f).apply {
        addUpdateListener { updatedAnimation ->
            arrow.rotation = updatedAnimation.animatedValue as Float
        }

        duration = 1000
        startDelay = 250
    }

    AnimatorSet().apply {
        playTogether(rvAnimator, arrowAnimator)
        start()
    }

}

fun CardView.isCollapsed(): Boolean {
    val content = findViewById<RecyclerView>(R.id.rv_content)
    return content.layoutParams.height == 0

}

И щелчок, который запускает анимацию:

override fun onBindViewHolder(holder: SectionViewHolder, position: Int) {

    holder.itemView.setOnClickListener {
        if ((it as CardView).isCollapsed()) {
            it.expand(holder.maxHeight)
        } else {
            it.collapse()
        }
    }
}

Однако моя анимация, кажется, вызывает некоторые очень странные проблемы с рисованием. При первом нажатии CardView происходит какая-то задержка. Еще более интересным является тот факт, что CardView всегда возвращается к расширению после завершения анимации:

enter image description here

Когда стрелка направлена ​​вверх, CardView следует свернуть, и наоборот, когда стрелка направлена ​​вниз.

Кто-нибудь сможет предоставить какие-либо сведения о том, как решить эту проблему? Я даже не знаю, с чего начать при отладке анимации. Любой вклад приветствуется:)

1 Ответ

0 голосов
/ 23 января 2019

Вам не нужно создавать анимацию коллапса.

Вы можете просто повернуть анимацию, которую вы создали, чтобы развернуть, как это:

rvAnimator.reverse()
arrowAnimator.reverse()

для этого вы не можете использовать AnimatorSet, вы должны запустить обе анимации самостоятельно так:

rvAnimator.start()
arrowAnimator.start()
...