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或子2Linearlayout
中,因此如果我添加或删除一个项,子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.