在我的应用程序中,我有一个线性的 View 布局。这些 View 的大小可能会由于其自身布局的变化而变化。特别是,第一个 View (sceneRoot
) 由可隐藏部分 (view1
) 和始终可见部分 (view2
) 组成。我想分两步为 view1
的出现和消失设置动画:
这是迄今为止的结果:
问题在于,一旦 view1
更改可见性,sceneRoot
就会立即更改其边界。 view3
跳转到新位置,使消失过渡看起来被剪切。
理想情况下,我希望 sceneRoot
的高度能够相应地设置动画。如果这是不可能实现的,我希望高度在消失过渡完成之后改变,而不是在开始之前改变。
这是有问题的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:id="@+id/scene_root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/view_1"
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="@android:color/holo_red_light"
android:gravity="center"
android:text="View 1 (Hideable)"
android:textSize="24sp" />
<TextView
android:id="@+id/view_2"
android:layout_width="match_parent"
android:layout_height="100dp"
android:background="@android:color/holo_orange_light"
android:gravity="center"
android:text="View 2"
android:textSize="24sp" />
</LinearLayout>
<TextView
android:id="@+id/view_3"
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="@android:color/holo_green_dark"
android:gravity="center"
android:text="View 3"
android:textSize="24sp" />
</LinearLayout>
在这个简化的示例中,单个 LinearLayout
就足够了。但在现实生活中,布局扁平化并不是那么容易实现的。
以下是我更改 view1
可见性的方法:
private fun toggleView1Visibility() {
TransitionManager.endTransitions(sceneRoot)
val isView1Appearing = view1.visibility != View.VISIBLE
TransitionManager.beginDelayedTransition(
sceneRoot,
createTransition(isView1Appearing)
)
view1.visibility = if (isView1Appearing) View.VISIBLE else View.GONE
}
private fun createTransition(
isView1Appearing: Boolean
): Transition {
val view1Fade = Fade().apply {
addTarget(view1)
duration = 750
}
val view2ChangeBounds = ChangeBounds().apply {
addTarget(view2)
duration = 750
}
return TransitionSet().apply {
ordering = TransitionSet.ORDERING_SEQUENTIAL
if (isView1Appearing) {
addTransition(view2ChangeBounds)
addTransition(view1Fade)
} else {
addTransition(view1Fade)
addTransition(view2ChangeBounds)
}
}
}
我必须采取哪些选项来修复消失过渡而不诉诸布局扁平化?
谢谢。
最佳答案
显然,过渡目标不必是场景根的直接子级。
向 ChangeBounds()
添加更多目标就达到了目的:
private fun createTransition(
isView1Appearing: Boolean
): Transition {
val view1Fade = Fade().apply {
addTarget(view1)
duration = 750
}
val changeBounds = ChangeBounds().apply {
addTarget(sceneRoot)
addTarget(view2)
addTarget(view3)
duration = 750
}
return TransitionSet().apply {
ordering = TransitionSet.ORDERING_SEQUENTIAL
if (isView1Appearing) {
addTransition(changeBounds)
addTransition(view1Fade)
} else {
addTransition(view1Fade)
addTransition(changeBounds)
}
}
}
希望它对某人有用。
关于android - 转换 : How to change parent view size after transition is finished?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56923462/