android - 转换 : How to change parent view size after transition is finished?

标签 android android-animation android-transitions

在我的应用程序中,我有一个线性的 View 布局。这些 View 的大小可能会由于其自身布局的变化而变化。特别是,第一个 View (sceneRoot) 由可隐藏部分 (view1) 和始终可见部分 (view2) 组成。我想分两步为 view1 的出现和消失设置动画:

  • 如果 view1 消失,1) view1 淡出,然后 2) view2 向上移动 ( 1 ) ,
  • 如果 view1 出现,1) view2 向下移动,然后 2) view1 淡入 ( 2 ) .

这是迄今为止的结果:

disappear transition appear transition

问题在于,一旦 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/

相关文章:

android - 在设备上禁用动画会使应用程序崩溃

Android:View.animate() 不适用于 ImageButton 的自定义背景

android - android滚动时如何拉动类似于弹性类型的布局?

java - 当 onBackPressed() 被覆盖时保留过渡动画

android - ViewPager 转换像 Google Play Music "Player"

android - 使用 .setEnabled() 启用/禁用选项菜单按钮?

android - 如何将缺少的模块导入 monkeyrunner 脚本?

java - 在 Firebase 中仅下载部分数据库引用?

android - 使用 Twitter4j 获取关注者列表的最有效方法是什么?

android - 如何在 Activity 转换中包含一个独立的 View ?