Я пытался создать анимацию свертывания / развертывания для моего 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
всегда возвращается к расширению после завершения анимации:
Когда стрелка направлена вверх, CardView
следует свернуть, и наоборот, когда стрелка направлена вниз.
Кто-нибудь сможет предоставить какие-либо сведения о том, как решить эту проблему? Я даже не знаю, с чего начать при отладке анимации. Любой вклад приветствуется:)