gpt4 book ai didi

android - 如何指定 TransitionManager.beginDelayedTransition 仅影响直接 subview

转载 作者:行者123 更新时间:2023-12-03 18:15:39 34 4
gpt4 key购买 nike

我正在尝试使用 ConstraintLayout结合动画上下滑动的 View 。
这些 View 是垂直组织的,带有 RecyclerView在顶部和下面堆叠的另外两个 View :

<constraint layout container>
[ ]
[ recycler view ]
[ ]
[48dp height 1st view]
[48dp height 2nd view]
</constraint layout container>

动画非常简单:当点击按钮时,第一个 View 从容器底部移动到您可以在上面看到的位置,当再次点击时,它向下移动并保持与第二个 View 重叠。发生这种情况时, RecyclerView在顶部会改变高度,因为它被限制在第一个 View 中,否则它将留下一个空白空间。

到目前为止一切顺利,动画运行良好,但是当用户点击按钮过快时会出现问题,导致以下错误:
    java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

在调查了发生的事情后,我发现这个问题是 TransitionManager 的结果。我用来为更改设置动画。我发现很有趣,当点击按钮向上(或向下,想象相反的步骤)移动第一个 View 时,经理正在执行以下操作:
  • RecyclerView 中淡出第一个/最后一个 View (取决于您是否启用了反向布局或堆栈)
  • RecyclerView 中删除该 View
  • 降低 RecyclerView 的高度
  • 将第一个 View 上移

  • 尽管我在所有我能想象到的地方都指定了 RecyclerView不应为项目更改设置动画, TransitionManager正在覆盖它,这意味着当同一 View 即将从 RecyclerView 中删除时,会有一个窗口。可以再次添加到同一个父级,并且该窗口是当 View 被管理器淡出时。

    由于淡入淡出动画不是那么快,用户可以很容易地在此期间点击按钮两次,导致管理器重新添加淡入淡出 View ,该 View 已经在 RecyclerView 中。从而在抛出上述错误时使应用程序崩溃。

    由于这是 RecyclerView 内部引起的问题。如果里面没有动画我会很好,因此我想知道如何在 TransitionManager.beginDelayedTransition 中指定只为 ConstraintLayout 的直接 subview 设置动画,这样它就不会为 RecyclerView 中的 View 设置动画。 .

    相关文档对此没有任何帮助,所以我在这里提出这个问题;如何限制过渡到直接 subview ?

    如果可能有帮助,我会在此处包含过渡管理器的 fragment
        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);

    最佳答案

    pskink 在评论中发布了答案,但是在两次要求他发布作为我接受并且从不这样做的答案之后,我会改为发布并将其标记为已回答。
    TransitionManager有一个方法excludeChildren这非常适合我正在寻找的东西。您可以按类类型、特定 View 的子项等使用。

    编辑:添加请求的示例

        AutoTransition autoTransition = new AutoTransition();
    autoTransition.excludeChildren(R.id.recyclerView, true);
    TransitionManager.beginDelayedTransition(constraintLayout, autoTransition);

    constraintLayout作为目标 View 的父级和 R.id.recyclerView作为我不想动画的那个 parent 的 subview ,在这个具体的例子中。您还可以排除属于特定类别的所有 child (例如 EditText)等等。

    关于android - 如何指定 TransitionManager.beginDelayedTransition 仅影响直接 subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50457303/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com