【问题标题】:MotionLayout collapses RecyclerView header but does not expandMotionLayout 折叠 RecyclerView 标头但不展开
【发布时间】:2021-04-23 10:10:49
【问题描述】:
我创建了一个sample project 可以重现此问题。
预期结果
- 当我向上滚动底部 RecyclerView 时,顶部 RecyclerView 折叠
- 当我向下滚动底部 RecyclerView 时,顶部 RecyclerView 展开
观察结果
- 当我向下滚动底部 RecyclerView 时,顶部 RecyclerView 不会展开
附加信息
- 当顶部 RecyclerView 折叠到一半时,尝试按住滑动,然后向下滑动。您可以看到顶部项目的一半被切割。
- 这只发生在折叠视图是/包含 RecyclerView 的情况下。
GIF
(忽略颜色的变化 - 这只是压缩 GIF 的结果)
问题
我做错了什么还是 MotionLayout 错误?
【问题讨论】:
标签:
android
android-recyclerview
android-motionlayout
【解决方案1】:
我想出了一个替代解决方案。
为了方便交流,我将rvTop 用于顶部的 RecyclerView,rvBottom 用于底部的 RecyclerView。
我们的想法是“隐藏”它,而不是“缩小”rvTop。
所以我们需要在它们之间引入一条新的不可见线,而不是让 rvBottom 约束到 rvTop 的底部,并使用 MotionLayout 使这条不可见线向上动画,同时保持 rvTop 的 alpha 变化。
为了做到这一点,我们必须使 rvBottom 不透明,否则它会与褪色的 rvTop 重叠。
我已更新sample project 中的代码以演示更改。
而效果是:
编辑:
另一种选择是在转换后移除 rvTop 对父级顶部的约束。
是的,这将使它简单地与 rvBottom 一起滚动;但我们可以添加一点translationY 使其“滚动速度比 rvBottom 慢”。
这可以处理无法使 rvBottom 不透明的情况,例如页面本身使用渐变背景。
效果如下: