Нужно сделать анимацию для экрана показа чата сообщений как в 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
            }
        }

Ответы (0 шт):