使用" animateLayoutChanges"动画布局XML中的属性

时间:2014-07-04 04:41:39

标签: android xml android-layout android-animation

我有LinearLayout,我在父android:animateLayoutChanges="true"中应用了LinearLayout。当用户点击切换按钮时,LinearLayout“折叠”(我以编程方式将视图的可见性设置为LinearLayout.GONE,当他们再次单击它时,它会通过以编程方式将可见性设置回{{1 }}

它的折叠和扩展动画正常工作。

但是,在折叠动画完成之前,可折叠/可展开LinearLayout.VISIBLE下方的任何项目都会回到顶部。正在回溯的项目不在LinearLayout设置为animateLayoutChanges的父项中,我认为没有任何方法可以将它们放入其中。

这是我的布局层次结构(我没有提到保持简短的属性):

true

整个布局以编程方式插入另一个<!-- Top most LinearLayout--> <LinearLayout> <!-- LinearLayout containing android:animateLayoutChanges="true"--> <LinearLayout> <!-- RelativeLayout containing button to toggle LinearLayout visibility below--> <RelativeLayout> </RelativeLayout> <!-- LinearLayout that has its visibility toggled --> <LinearLayout> </LinearLayout> </LinearLayout> </LinearLayout> (见下文):

LinearLayout

我意识到,如果我添加<LinearLayout android:id="@+id/form_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <!-- This is where the previous XML layout containing the toggle-able LinearLayout is inserted programmatically. --> <!-- This button snaps back up to the top before the animation is complete. --> <Button /> </LinearLayout> ,并将ButtonLinearLayout匹配为真,我就会解决问题。但是,由于一些原因,这不是一种选择。

还有其他工作吗?

3 个答案:

答案 0 :(得分:1)

而不是使用animateLayoutChanges尝试添加   您的onClick方法中TransitionManager.beginDelayedTransition(transitionsContainer); transitionsContainer是应该设置动画的视图的父级。

例如,您的父布局是

<LinearLayout android:id="@+id/transitions_container">

    <!--add your widgets here-->

</LinearLayout>

在代码中

final ViewGroup transitionsContainer = (ViewGroup) view.findViewById(R.id.transitions_container);

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        TransitionManager.beginDelayedTransition(transitionsContainer);
        // do your staff with changing children of transitionsContainer           
    }
});

查看https://medium.com/@andkulikov/animate-all-the-things-transitions-in-android-914af5477d50了解详情。

答案 1 :(得分:0)

只是想一想......如果从嵌入式布局中删除'animateLayoutChanges'并将其添加到父布局(第二个XML),该怎么办?我怀疑这会激发一切。您可能必须在代码中将属性设置为true,因为您是以编程方式嵌入布局。

以下是如何以编程方式执行此操作 Stack-overflow

另一种选择是以编程方式在按钮上使用.animate属性

myButton.animate().translationY(floatYposition).setDuration(300); //300 milliseconds

答案 2 :(得分:0)

对于线性布局,请尝试也手动启用“更改”过渡 看看它的框架布局..尝试线性布局.. https://stackoverflow.com/a/51116293/2719243