android - 如何在 LinearLayout 内设置视图高度变化的动画?
问题描述
我正在开发一个 Android 4+ 应用程序,该应用程序使用非常简单的布局:多个视图使用 a LinearLayout
within 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)
作品进行此操作并没有任何问题。但是,当视图突然出现或消失时,它看起来并不好。相反,我想为更改设置动画。
我很惊讶我找不到一个简单的解决方案:
- 使用
android:animateLayoutChanges="true"
确实有效,但是我无法控制动画。 - 虽然使用 a
ValueAnimator
to changehiddenContainer.setScaleY(...)
使我可以控制动画setScaleY(0)
,但使容器不可见,而不会减少它在布局中占用的空间。 - 使用
ValueAnimator
来更改hiddenContainer.setHeight(...)
可能会起作用,但是我不想在显示容器(例如hiddenContainer.setHeight(300)
)时使用固定的高度值,而是由容器内容确定的高度。
那么,如何解决这个问题呢?
解决方案
对于布局更改(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)
推荐阅读
- python - 当我在 Pytorch 中应用 nn 模型时,损失不会减少
- reactjs - 我从 API 收到文件 URL 作为响应。当用户单击下载按钮时,应下载文件而不在新选项卡中打开文件预览
- shopify - 如何在不使用循环的情况下将多个图像添加到 Shopify 部分?
- pickle - Cassandra Reaper JMX_AUTH 错误,使用 cassandra 作为后端存储时?
- xamarin - Xamarin Google Maps 自定义消息弹出窗口
- maven - Makefile 运行 Maven 命令,但命令有“:”字符
- google-cloud-platform - 在 GCP 中创建 IAM 成员会引发错误 The size of the policy is too large
- react-native - 原生基础 FloatingLabel 焦点样式
- python - 如何使用 Python 更改或清除 Jira 中分辨率字段的值?
- wordpress - 无法导入磁盘空间不足。无法将内容写入文件。文件:/opt/bitnami/apps/wordpress/htdocs/wp-content/uploads 错误