如果目标位于重叠元素下方,则转换动画不流畅。

4
我正在使用一张图片作为共享元素来制作一个淡入淡出的活动转换动画。目标容器应该部分隐藏在另一个具有app:behavior_overlapTop属性的元素下面,在这种情况下是一个NestedScrollView。然而实际上,这个元素会在图像下面突然出现,并在动画结束时与它重叠。这样会产生不流畅的感觉,就像这样:问题说明 这是布局:
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

<android.support.design.widget.AppBarLayout
    android:id="@+id/app_bar_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    android:fitsSystemWindows="true">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toolbar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_scrollFlags="scroll|exitUntilCollapsed"
        app:expandedTitleMarginStart="48dp"
        app:expandedTitleMarginEnd="64dp"
        android:fitsSystemWindows="true">

        <com.mypackage.android.view.SquareImageView
            android:id="@+id/img"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:scaleType="centerCrop"
            android:fitsSystemWindows="true"
            app:layout_collapseMode="parallax"
            android:transitionName="@string/trans_gallery_img"/>

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            app:layout_collapseMode="pin" />

    </android.support.design.widget.CollapsingToolbarLayout>

</android.support.design.widget.AppBarLayout>

<android.support.v4.widget.NestedScrollView
    android:id="@+id/scroll"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipToPadding="false"
    app:behavior_overlapTop="45dp"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    ... stuff
</android.support.v4.widget.NestedScrollView>

我将使用的过渡效果是:
Fade fade = new Fade();
fade.excludeTarget(android.R.id.navigationBarBackground, true);
getWindow().setEnterTransition(fade);
getWindow().setExitTransition(fade);

ChangeBounds changeBoundsTransition = new ChangeBounds();
getWindow().setSharedElementEnterTransition(changeBoundsTransition);
getWindow().setSharedElementExitTransition(changeBoundsTransition);

即使我使用 Slide,它仍会产生相同的效果,重叠的元素会在下面滑动,最终以相同的方式结束。希望有一个解决方法。

1个回答

1
为了正确显示动画效果,需要将共享元素绘制在非共享元素上方,并在动画结束时返回到正常的视图层次结构中。这意味着在动画期间,共享元素将位于NestedScrollView上方,并在过渡结束(EnterTransitionSharedElementEnterTransition)时突然返回到其正常状态下方的NestedScrollView下方。
我知道两种管理此问题的方法:
1. 在style.xml中添加android:windowSharedElementsUseOverlay="false": 这样动画就不会覆盖其他视图,你只能在CollapsingToolbarLayout中看到动画。

2.- 在开始 NestedScrollView淡入 动画之前,等待共享元素过渡结束:

NestedScrollView 的可见性设置为 invisible

  <android.support.v4.widget.NestedScrollView
    ...
    android:visibility="invisible"
    >

设置一个监听器等待共享元素过渡结束并启动 NestedScrollView 的动画。

getWindow().getSharedElementEnterTransition().addListener(new Transition.TransitionListener() {

        ...

        @Override
        public void onTransitionEnd(Transition transition) {
            Animator anim   = ObjectAnimator.ofFloat(myNestedScrollView, "alpha", 0f, 1f);
            anim.setInterpolator(new DecelerateInterpolator());
            anim.setDuration(1000);
            ns.setVisibility(View.VISIBLE);
            anim.start();


        }

        ...

    });


谢谢您的建议。实际上,仔细观察后发现,动画元素覆盖了整个屏幕左上角的上按钮,这在我和您的第二个gif中都发生了。如果您的淡入解决方案也可以用于Up按钮,那就太好了。 - inmyth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接