Нужно сделать анимацию для экрана показа чата сообщений как в Telegram?
Нужно сделать анимацию как в экране чата с сообщения.
Анимация, которая показывает сообщения, группированные по дате и с аватаркой которая двигается вверх и вниз при прокрутке.
Пример, как нужно сделать:
У меня есть rvMessages recyclerview - список с сообщениями, группированных по дате, и внутри этого списка есть другой список innerAvatarWithMsgsRv, его items - avatarView и innerRv.
В итоге у меня анимация для аватарок работает только для первых элементов этого списка: проверяется видимость при скроллинге, если больше одного элемента, одновременно анимация для всех происходит.
Вот код который у меня почти работает, только не совсем верно:
rvMessages.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
val firstVisibleItem = lm.findFirstVisibleItemPosition()
val lastVisibleItem = lm.findLastVisibleItemPosition()
val innerItemView = lm.findViewByPosition(firstVisibleItem) ?: return
val innerAvatarWithMsgsRv = innerItemView.findViewById<RecyclerView>(R.id.rv_inner_avatar_with_messages)
innerAvatarWithMsgsRv.forEachVisibleHolder {holder ->
val innerItemView = holder.itemView
val avatarView = innerItemView.findViewById<ImageView>(R.id.iv_sender_avatar)
val innerRv = innerItemView.findViewById<RecyclerView>(R.id.rv_inner_messages)
// Calculate translation based on relative scroll position within innerRv
val maxTranslationY = innerRv.height.toFloat() - 40.dpToPx // Adjust as needed
val translationY = (dy + avatarView.translationY).coerceIn(-maxTranslationY, 0f)
// Check if the innerItemView is completely visible in innerAvatarWithMsgsRv
if (isViewCompletelyVisible(avatarView, innerAvatarWithMsgsRv)) {
avatarView.translationY = translationY
}
}
