繁体   English   中英

过渡:过渡完成后如何更改父视图的大小?

[英]Transitions: How to change parent view size after transition is finished?

在我的应用程序中,我具有线性的视图布局。 这些视图的大小可能会因其自身布局的更改而改变。 特别地,第一视图( sceneRoot )由可隐藏部分( view1 )和始终可见的部分( view2 )组成。 我想通过两个步骤来动画化view1的出现和消失:

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

到目前为止的结果是:

消失的过渡 出现过渡

问题在于,一旦view1更改可见性, sceneRoot就会立即更改其边界。 view3跳到其新位置,使消失的过渡看起来更view3

理想情况下,我希望sceneRoot的高度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()添加更多目标可以达到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)
        }
    }
}

希望对某人有用。

如果您找到答案,那就太好了。 我在这里也添加了一个Answer,尽管它在Java中,因为我对kotlin不太了解。

 private void toggleView1Visibility() {

        final int originalDimension = sceneRoot.getHeight();
        final int newDimension =sceneRoot.getHeight();


        Boolean isView1Appearing = view1.getVisibility() != View.VISIBLE;

        TransitionManager.beginDelayedTransition(sceneRoot, new TransitionSet()
                .addTransition(new ChangeBounds()));
        if (isView1Appearing){
            ViewGroup.LayoutParams params = sceneRoot.getLayoutParams();
            params.height = newDimension;
            sceneRoot.setLayoutParams(params);
            view1.setVisibility(View.VISIBLE );
        }

        else {
            TransitionManager.beginDelayedTransition(sceneRoot, new TransitionSet()
                    .addTransition(new ChangeBounds()));

            ViewGroup.LayoutParams params = sceneRoot.getLayoutParams();
            params.height = originalDimension;
            sceneRoot.setLayoutParams(params);
            view1.setVisibility(View.GONE);
        }
    }

请记住,这里的sceneroot是布局的父级LL。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM