Android - 从列表视图到工具栏标题

时间:2016-11-18 11:26:56

标签: android listview android-animation material-design shared-element-transition

在我的应用程序中尝试在一个活动的listview名称和下一个活动中的工具栏标题之间​​实现共享元素转换。我面临的问题是共享元素没有动画,因为它应该是动画以及整个布局的进入和退出过渡。

gif animation

此处保险文本应与整个动画分开制作动画。

调用活动动画如下:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            getWindow().setSharedElementReturnTransition(TransitionInflater.from(this)
                    .inflateTransition(R.transition.trans_move));
//            getWindow().setSharedElementExitTransition(new TransitionSet()
//                    .addTransition(new Fade()));
            Slide slideTransition = new Slide();
            slideTransition.setSlideEdge(Gravity.LEFT);
            slideTransition.setDuration(getResources().getInteger(R.integer.anim_duration_long));
            getWindow().setReenterTransition(slideTransition);
            getWindow().setExitTransition(slideTransition);
        }

setShareElementExitTransition对转换没有影响,因此将其注释掉

用于启动第二项活动的意图

ActivityOptionsCompat activityOptions
                = ActivityOptionsCompat.makeSceneTransitionAnimation(
                HomeActivity.this,
                new Pair<>(view.findViewById(R.id.nameTextView),
                        SharedCertificatesActivity.ab_title)
        );
        Intent _intent=new Intent(mContext, SharedCertificatesActivity.class);
        ActivityCompat.startActivity(HomeActivity.this,
                _intent, activityOptions.toBundle());

第二个活动有以下场景转换

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//             Re-enter transition is executed when returning to this activity
            Slide slideTransition = new Slide();
            slideTransition.setSlideEdge(Gravity.LEFT);
            slideTransition.setDuration(getResources().getInteger(R.integer.anim_duration_medium));
            Slide slideRightTransition = new Slide();
            slideRightTransition.setSlideEdge(Gravity.RIGHT);
            slideRightTransition.setDuration(getResources().getInteger(R.integer.anim_duration_medium));
//            getWindow().setAllowReturnTransitionOverlap(true);
            getWindow().setReenterTransition(slideRightTransition);
            getWindow().setExitTransition(slideTransition);
//            getWindow().setSharedElementEnterTransition(TransitionInflater.from(this)
//                    .inflateTransition(R.transition.trans_move));
            ViewCompat.setTransitionName(title, ab_title);

        }

我在SO上也发现了一个类似的问题here,但那里提到的解决方案对我没用。 如果上面的问题那么第二个活动的布局如下:

    <?xml version="1.0" encoding="utf-8"?>
    <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:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">


            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?android:attr/actionBarSize"
                android:background="@color/primary"
                app:popupTheme="@style/AppTheme.PopupOverlay">

                <TextView
                    android:id="@+id/title"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical|start"
                    android:fontFamily="sans-serif-medium"
                    android:text="Binder Name"
                    android:textColor="@color/_kAppearanceUINavigationBarTextColor"
                    android:textSize="20sp" />

            </android.support.v7.widget.Toolbar>

            <include layout="@layout/binder" />
        </LinearLayout>
.
.
.
</android.support.design.widget.CoordinatorLayout>

任何帮助都将受到高度赞赏

1 个答案:

答案 0 :(得分:0)

解决了这个问题 问题主要是由于动画时间问题。与其他窗口动画相比,共享元素的动画效果更快(默认值)。更改了第二个活动中的setupWindowAnimations方法,如下所示

private void setupWindowAnimations() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Slide slideTransition = new Slide();
            slideTransition.setSlideEdge(Gravity.LEFT);
            slideTransition.setInterpolator(new DecelerateInterpolator());
            slideTransition.setDuration(460);
            Slide slideRightTransition = new Slide();
            slideRightTransition.setSlideEdge(Gravity.RIGHT);
            slideRightTransition.setDuration(getResources().getInteger(R.integer.anim_duration_long));
            getWindow().setReenterTransition(slideRightTransition);
            getWindow().setExitTransition(slideTransition);
            getWindow().setEnterTransition(slideTransition);
            getWindow().setSharedElementEnterTransition(new ChangeBounds().setDuration(450));
            getWindow().setSharedElementReturnTransition(null);
            ViewCompat.setTransitionName(title, ab_title);
            ViewCompat.setTransitionName(menu1, fab_anim);

        }
    }

现在更顺畅,共享元素按预期结果转换。信用转到guides.codepath.comGeorge Mount blog以清除有关共享元素转换的更多信息。

注意:谷歌bug用于将共享元素textview返回给调用活动,该活动直到日期尚未解决。所以必须禁用来自调用活动的共享元素返回转换。