我正在使用一个布局非常简单的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)
),而是确定了高度根据容器的内容。那么,如何解决这个问题?
答案 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)