【问题标题】:How to animate height change of views inside a LinearLayout?如何在 LinearLayout 内设置视图高度变化的动画?
【发布时间】:2018-11-13 22:35:36
【问题描述】:

我正在开发一个使用非常简单布局的 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 的正下方。单击TopContainer 中的Button 可切换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)),而是由容器内容确定的高度。

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

【问题讨论】:

    标签: android animation android-animation


    【解决方案1】:

    为了使您的布局更改(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)
    

    【讨论】:

    • 谢谢,这很好用。然而,当隐藏视图时,滚动立即“折叠”而不是动画。假设 ScrollView 当前显示 ToggleButton 和完整的HiddenContainer。所以 ToggleButton 将位于屏幕顶部。隐藏HiddenContainer 时,按钮“跳”到屏幕底部(因为滚动内容不再填满整个屏幕),然后可以看到底部视图如何动画化到顶部视图。因此,虽然动画效果很好,但滚动内容的大小变化会立即发生。
    • 在这种情况下,您应该为 ScrollView 的根布局调用 beginAuto,当您更改 HiddenContainer 动画器的可见性时,此解决方案也会为 ScrollView 中的 BottomContainer 坐标变化设置动画
    • 如我的帖子中所示 ScrollView 是根布局。即使我添加另一个布局来包装 ScrollView 并将 beginAuto 应用到这个布局,结果也完全一样。
    • 您可以尝试使用 beginChangeBounds 代替 beginAuto,或者为 ScrollView 的父级(或根布局)调用 beginAuto。我希望其中一个解决方案对您有所帮助。
    • 过渡类型(auto、fade、changeBound 等)没有任何区别。如前所述,ScrollView 是根布局(没有父级),添加父级也没有区别。
    猜你喜欢
    • 1970-01-01
    • 2013-09-25
    • 2019-02-20
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多