首页 > 解决方案 > 如何在 LinearLayout 内设置视图高度变化的动画?

问题描述

我正在开发一个 Android 4+ 应用程序,该应用程序使用非常简单的布局:多个视图使用 a LinearLayoutwithin a堆叠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)作品进行此操作并没有任何问题。但是,当视图突然出现或消失时,它看起来并不好。相反,我想为更改设置动画。

我很惊讶我找不到一个简单的解决方案:

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

标签: androidanimationandroid-animation

解决方案


对于布局更改(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)

推荐阅读