边距和宽度/高度的AnimateLayoutChanges只有在另一个元素出现/消失时才有效

时间:2015-05-23 02:42:19

标签: android

我设置了一个简单的活动来试图解决这个问题。 我有一个FrameLayout,我在其中启用了#34; AnimateLayoutchanges"。 我有一个按钮,可以更改TextView的布局边距和宽度。 如果这是唯一的布局更改,则边距和宽度的更改将不会生成动画。但是,如果我简单地设置可见性,如果另一个子帧具有相同的FrameLayout,则可见性更改和边距/宽度更改都将设置动画。

旁注:可见性和边距+宽度变化将按顺序发生,而不是同时发生,有没有办法改变这种行为?

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#888"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".activities.TestActivity">

    <android.support.v7.widget.Toolbar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/PivotTheme" />


    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="buttonHandler"
        android:text="test button 1" />


    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:animateLayoutChanges="true"
        android:background="@color/white">

        <TextView
            android:id="@+id/testTv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@color/purple_gradient_end"
            android:text="TestView" />

        <TextView
            android:id="@+id/testTv2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:background="@color/purple_gradient_end"
            android:text="TestView" />

    </FrameLayout>

</LinearLayout>

的活动:

public void buttonHandler(View view){
    FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) testTv.getLayoutParams();
    if(testDown) {
        params.setMargins(100, 400, 0, 0);
        params.width = 400;
        testTv2.setVisibility(View.GONE);// if I comment out this line, nothing will animate
        testDown = false;
    } else {
        params.setMargins(0, 0, 0, 0);
        params.width = 100;
        testTv2.setVisibility(View.VISIBLE);
        testDown = true;
    }
    testTv.setLayoutParams(params);
}

我觉得这是android的一个错误,其中边距或宽度的变化无法设置触发动画的标志,但如果通过更改可见性设置此标志,则所有动画都会得到正确处理。

1 个答案:

答案 0 :(得分:0)

对于这种类型的更改(如更改参数),您还需要启用“更改”(animateLayoutChange必须为true)

    val frmMain=findViewById<FrameLayout>(R.id.frmMain)

    val currentTransitions=frmMain.layoutTransition
    currentTransitions.enableTransitionType(LayoutTransition.CHANGING)
    frmMain.layoutTransition=currentTransitions