【问题标题】:How to propagate progress from root MotionLayout to its child RecyclerView which contains MotionLayout item?如何将进度从根 MotionLayout 传播到包含 MotionLayout 项目的子 RecyclerView?
【发布时间】:2021-04-01 07:44:38
【问题描述】:

我有带有MotionLayout (1) 的片段。通过向下滑动(自定义工具栏)可以扩展其中一个子布局。此子布局包含RecyclerView,每个项目内还有另一个MotionLayout (2)。

TransitionListener 连接到 (1)。

MotionLayout (1) 检测到滑动过渡(使用TransitionListener)时,它应该将其progress 传播到当前可见的RecyclerView 项目的MotionLayout (2) 以便自定义工具栏的动画展开和动画可见的RecyclerView 项目已同步。

问题是尽管RecyclerView item 接收到progress 手动发送的TransitionListener.onTransitionChange 方法的值,RecyclerView item 动画被冻结到开始/结束状态之一,并且没有动画可见。

RecyclerView 外自定义工具栏向下滑动发送进度到MotionLayout (2) 并且状态改变和动画正常发生。

MotionScene 以编程方式添加到每个RecyclerView 项目的MotionLayout,因为数据是动态的,不能单独在MotionLayout (2) 的motion_scene.xml 中描述。 (我使用https://medium.com/androiddevelopers/working-with-dynamic-data-in-motionlayout-9dbbcfe5ff75 方法以编程方式添加 MotionScene 过渡和状态)。

我如何让MotionLayout (1) 将进度传播到RecyclerView 项目的“MotionLayout”(2)?

【问题讨论】:

    标签: android android-recyclerview android-motionlayout


    【解决方案1】:

    如果没有 Kotlin,目前无法使用 RecyclerView 执行此操作。下面我将详细介绍如何做到这一点。


    我将进度传播到每个ViewHolder 的方式是设置RecyclerView.OnScrollListeneronScrolled

    • 获取对RecyclerView 的当前LayoutManager 的引用
    • 使用findFirstVisibleItemPositionfindLastVisibleItemPosition 获取我应该寻找的ViewHolders 的范围。
    • 使用LayoutManager.findViewByPosition 获取View 引用,使用RecyclerView.getChildViewHolder 获取每个ViewHolder 引用。
    • 过滤掉空结果
    • 为我的用例计算每个特定 ViewHolder 的进度。
    • 更新每个ViewHolder的进度

    在实践中(以及一些处理这些位的扩展函数),Kotlin 中的整体流程应该如下所示:

    recyclerView.activeViewHolders(onlyVisible = true)
        .mapNotNull { viewHolder -> viewHolder as? WidgetViewHolder }
        .forEach { viewHolder ->
            val position = viewHolder.adapterPosition
            val awayFromCenter = recyclerView.calculateHorizontalOffsetPercentage(position)
            viewHolder.resize(awayFromCenter)
        }
    

    这个解决方案对我来说在 Kotlin 合成和 ViewBinding 上都很顺利。


    因为您提到您拥有非常动态的数据,所以听起来 Carousel 不适合您,但您应该检查一下它目前正在开发中:https://github.com/androidx/constraintlayout/wiki/Carousel

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      相关资源
      最近更新 更多