Android animateLayoutChanges不适合嵌套布局?

Android animateLayoutChanges不适合嵌套布局?,android,android-layout,android-animation,Android,Android Layout,Android Animation,我有一个嵌套布局,如下所示: <LinearLayout> <!----Parent layout---> <LinearLayout> <!-----child 1---> ... </LinearLayout> <!----child 1 ended---> <LinearLayout> <!-----child 2--->

我有一个嵌套布局,如下所示:

 <LinearLayout>     <!----Parent layout--->
    <LinearLayout>    <!-----child 1--->
       ...
    </LinearLayout>   <!----child 1 ended--->
    <LinearLayout>    <!-----child 2--->
       ...
    </LinearLayout>   <!----child 2 ended--->
 </LinearLayout>    <!----Parent endded--->

...
...
我现在遇到的问题是,由于我的所有数据项都在子1或子2
Linearlayout
中,因此如果我添加或删除一个项,子Linearlayout将设置动画,效果为animatelayoughchanges,但父布局将不做任何动画。(我将所有线性布局的
android:animateLayoutChanges
设置为
true
)。特别是当我删除子1中的一个项目时,动画效果会变得奇怪(基本上,当子1仍在制作动画时,子2会跳起来)

有人知道怎么解决这个问题吗

谢谢

更新

在我发布这个问题后不久,我在android开发者的网站LayoutTransitionAPI中发现了这个问题

由于不同层次布局之间的相互关系,在嵌套视图层次的多个层次上使用LayoutTransition可能不起作用


那么有人对这个问题有什么解决建议吗?

属性利用了
布局转换
,从Android 4.0开始,它将布局层次结构中的子级和祖先一直设置到树的顶部。在“蜂巢”中,只有布局的子项将设置动画。有关详细信息,请参阅

不幸的是,目前似乎没有简单的方法让版面的同级对其
LayoutTransitions
做出反应。您可以尝试使用
TransitionListener
在更改布局边界时获得通知,并使用动画制作程序相应地移动同级视图。请参阅中Chet Haase的第二个答案

编辑——事实证明有一种方法。在Android 4.1+(API级别16+)中,您可以使用默认禁用的布局转换类型
更改
。要在代码中启用它,请执行以下操作:

ViewGroup layout = (ViewGroup) findViewById(R.id.yourLayout);
LayoutTransition layoutTransition = layout.getLayoutTransition();
layoutTransition.enableTransitionType(LayoutTransition.CHANGING);
因此,在您的示例中,要为child 2布局设置动画,您需要为其启用
CHANGING
布局转换。当其父对象的边界发生变化时,将应用转换


有关更多详细信息,请参阅。

似乎父对象上的延迟转换也适用于动画制作。至少对我来说,下面的代码给出了一个适当的展开/折叠动画

expandTrigger.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        TransitionManager.beginDelayedTransition(parentLayout);
        expanded = !expanded;

        child1.setVisibility(expanded ? View.VISIBLE : View.GONE);
    }
});

对于深度嵌套的布局,您有时可能需要在调用
TransitionManager

时使用层次结构中较高的父级,我们已将android:animateLayoutChanges属性添加到我们的LinearLayout中,但更改没有触发动画。要解决此问题,请使用以下代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
((ViewGroup) findViewById(R.id.llRoot)).getLayoutTransition()
      .enableTransitionType(LayoutTransition.CHANGING);
}

  • 确保将
    android:animateLayoutChanges=“true”
    添加到将调整视图组的大小(
    LinearLayout
    /
    RelativeLayout
    /
    框架布局
    /
    协调布局

  • 使用
    setVisibility()
    来控制目标的可见性
    视图

  • 从这里仔细聆听,
    android:animateLayoutChanges=“true”
    添加到视图组的外部将调整视图组的大小,此外部
    视图组
    必须是包装受动画影响的所有位置更改
    视图
    的人

    expandTrigger.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            TransitionManager.beginDelayedTransition(parentLayout);
            expanded = !expanded;
    
            child1.setVisibility(expanded ? View.VISIBLE : View.GONE);
        }
    });
    
  • 活动
    中的
    集合可见性()之前添加以下代码
    ,这里的
    根线布局
    是我上面提到的外部
    视图组

     LayoutTransition layoutTransition = rootLinearLayout.getLayoutTransition();
     layoutTransition.enableTransitionType(LayoutTransition.CHANGING);
    

  • 之前:

    之后:


    提醒:如果错过第三步,将出现空指针异常。

    祝你好运

    作为Kotlin扩展

    fun ViewGroup.forceLayoutChanges() {
        layoutTransition.enableTransitionType(LayoutTransition.CHANGING)
    }
    
    用法


    注:


    根据我的经验,当容器是深嵌套布局时,就会发生这种情况。由于某种原因,android:animateLayoutChanges=“true”不起作用,但使用此函数将强制它起作用。

    我确实尝试过此功能,但在我的情况下效果并不理想,我认为将enableTransitionType设置为Change与将animateLayoutChanges标志设置为true具有类似的效果。无论如何,我换了另一种方法,所以不再需要为嵌套布局设置动画。@Vijju我不再使用这种设计,而是采用了另一种方法。从我读过的文档来看,我认为这不容易做到,所以我想你要么不制作这个小动画,要么自己编写转换。使用LayoutTransition.enableTransitionType(LayoutTransition.Change)非常有效!谢谢layoutTransition.enableTransitionType(layoutTransition.Changeing);确实适用于嵌套布局,只需将其添加到父布局中即可。但是,消失的视图将不同步,您将看到,当您离开视图时,父布局将在子视图之前首先完成。要解决此问题,还需要修改子布局转换并设置layoutTransition.setStartDelay(layoutTransition.CHANGE_,0);通过执行此操作,显示和消失将与父级和子级同步。@Chronogenere setStartDelay确实会在两个转换之间同步,但消失视图在其旁边移动的子级上逐渐消失。有没有办法在淡出完成后开始改变动作?谢谢你的详细解释!我很感谢您为添加GIF所做的努力。非常感谢+1.