如何在LinearLayout中为视图的高度变化设置动画?

时间:2018-11-13 14:14:01

标签: android animation android-animation

我正在使用一个布局非常简单的Android 4+应用程序:LinearLayout内的ScrollView堆叠了多个视图

<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:ignore="HardcodedText,UseCompoundDrawables,UselessParent"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:focusableInTouchMode="true">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" 

        <!-- Top Container -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" 

            <Button... />
        </LinearLayout>

        <!-- Hidden Container -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" 

            ... Some Content ...

        </LinearLayout>

        <!-- Bottom Container -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" 

            ... Some Content ...

        </LinearLayout>
    </LinearLayout>
</ScrollView>

创建布局时,HiddenContainer应该不可见。因此,一开始BottomContainer就在TopContainer的正下方。在Button中单击TopContainer可以切换HiddenContainer的可见性。

使用hiddenContainer.setVisibility(hiddenContainer.getVisibility() == View.VISIBLE ? View.GONE : View.VISIBLE)执行此操作可以发现并且没有任何问题。但是,当视图突然出现或消失时,效果并不理想。 相反,我想制作更改动画。

我为无法找到简单的解决方案感到惊讶:

  • 使用android:animateLayoutChanges="true"确实可以,但是我无法控制动画。
  • 使用ValueAnimator更改hiddenContainer.setScaleY(...)时,我可以控制动画setScaleY(0),使容器不可见,而不会减少其在布局中占用的空间。
  • 使用ValueAnimator更改hiddenContainer.setHeight(...)可能有效,但是我不想在显示容器时使用固定的高度值(例如hiddenContainer.setHeight(300)),而是确定了高度根据容器的内容。

那么,如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

要动画化布局更改(alpha,可见性,高度等),可以使用TransitionManager。例如:我有三种静态方法,当我想对布局更改进行动画处理时可以使用它们:

public static final int DURATION = 200;

public static void beginAuto(ViewGroup viewGroup) {
    AutoTransition transition = new AutoTransition();
    transition.setDuration(DURATION);
    transition.setOrdering(TransitionSet.ORDERING_TOGETHER);
    TransitionManager.beginDelayedTransition(viewGroup, transition);
}

public static void beginFade(ViewGroup viewGroup) {
    Fade transition = new Fade();
    transition.setDuration(DURATION);
    TransitionManager.beginDelayedTransition(viewGroup, transition);
}

public static void beginChangeBounds(ViewGroup viewGroup) {
    ChangeBounds transition = new ChangeBounds();
    transition.setDuration(DURATION);
    TransitionManager.beginDelayedTransition(viewGroup, transition);
}

当要对布局更改进行动画处理时,可以在更改布局之前调用以下方法之一:

beginAuto(hiddenContainerParentLayout);
hiddenContainer.setVisibility(hiddenContainer.getVisibility() == View.VISIBLE ? View.GONE : View.VISIBLE)