如何指定TransitionManager.beginDelayedTransition仅影响直接子视图

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(取决于您是否启用了反向布局或从头到尾堆叠)
  • RecyclerView
  • 降低高度 RecyclerView
  • 向上移动第一个视图

即使我在所有位置都指定了位置,我也可以想象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)

Sha*_*dow 7

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例如),依此类推。


epo*_*ool 6

我是这样修复的:

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))这似乎是崩溃的原因。至少对我来说,动画看起来与原版非常相似。