Sha*_*dow 1 android android-transitions android-recyclerview
我正在尝试ConstraintLayout结合使用与动画上下滑动的视图。这些视图是垂直组织的,RecyclerView顶部是,下面是其他两个视图:
<constraint layout container>
[ ]
[ recycler view ]
[ ]
[48dp height 1st view]
[48dp height 2nd view]
</constraint layout container>
Run Code Online (Sandbox Code Playgroud)
动画非常简单:轻按一个按钮时,第一个视图从容器的底部移到您可以在上方看到的位置,再次轻击时,它向下移动并在第二个视图上保持重叠。发生这种情况RecyclerView时,顶部会更改高度,因为它会受限于该第一个视图,否则它将留出空白空间。
到目前为止,效果很好,动画效果良好,但是当用户过快地点击按钮时会出现问题,从而导致以下错误:
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
Run Code Online (Sandbox Code Playgroud)
在调查了发生了什么之后,我发现这个问题是由于TransitionManager我正在使用动画制作更改的结果。我发现的很有趣,当点击按钮以将第一个视图上移(或下移,想象一下相反的步骤)时,经理正在执行以下操作:
RecyclerView(取决于您是否启用了反向布局或从头到尾堆叠)RecyclerViewRecyclerView即使我在所有位置都指定了位置,我也可以想象RecyclerView不应该为项目更改设置动画,但是TransitionManager覆盖了它,这意味着当即将要从中移除的同一视图RecyclerView可以再次添加到同一视图时,存在一个窗口父窗口,而该窗口就是管理器正在淡出视图的时间。
由于淡入淡出的动画速度不是那么快,因此用户可以在这段时间内非常轻松地轻按两次按钮,从而使管理者重新添加已经存在的淡入淡出视图,RecyclerView从而在抛出上述错误时使应用程序崩溃。
由于这是内部引起的问题RecyclerView,因此在其中没有动画的情况下我会很好,因此,我想知道如何在中指定TransitionManager.beginDelayedTransition仅对的直接子视图进行动画处理ConstraintLayout,这样就不会对进行动画处理里面的景色RecyclerView。
相关文档对此没有任何帮助,因此在此提出这个问题。如何限制过渡到直接子视图?
如果这可能会有所帮助,请在此处包括过渡管理器的代码段
final ConstraintSet constraintSet;
final ConstraintLayout constraintLayout;
constraintSet = new ConstraintSet();
constraintLayout = (ConstraintLayout) viewParent;
TransitionManager.beginDelayedTransition(constraintLayout);
constraintSet.clone(constraintLayout);
constraintSet.connect(startId, startSide, endId, endSide, margin);
constraintSet.applyTo(constraintLayout);
Run Code Online (Sandbox Code Playgroud)
pskink在评论中发布了答案,但在两次要求他发布作为我接受但从未做过的答案之后,我将其发布并标记为已回答。
该TransitionManager有一个方法excludeChildren是完全适用于什么,我一直在寻找。您可以按类类型,特定视图的子级使用等等。
编辑:添加示例请求
AutoTransition autoTransition = new AutoTransition();
autoTransition.excludeChildren(R.id.recyclerView, true);
TransitionManager.beginDelayedTransition(constraintLayout, autoTransition);
Run Code Online (Sandbox Code Playgroud)
随着constraintLayout作为目标视图的父母R.id.recyclerView是该父母的孩子认为我不想被动画化,在这是具体的例子。您还可以排除所有属于特定班级的孩子(EditText例如),依此类推。
我是这样修复的:
TransitionManager.beginDelayedTransition(
constraintLayout,
TransitionSet().apply {
ordering = TransitionSet.ORDERING_SEQUENTIAL
addTransition(ChangeBounds())
addTransition(Fade(Fade.IN))
}
)
Run Code Online (Sandbox Code Playgroud)
AutoTransition如果我们不传递自定义转换,它几乎是相同的代码,其中的默认代码,但我删除了addTransition(Fade(Fade.OUT))这似乎是崩溃的原因。至少对我来说,动画看起来与原版非常相似。
| 归档时间: |
|
| 查看次数: |
2564 次 |
| 最近记录: |