Android — переход общего элемента из списка в заголовок панели инструментов

В моем приложении я пытаюсь реализовать переход общего элемента между именем списка из одного действия и заголовком панели инструментов в следующем действии. Проблема, с которой я столкнулся, заключается в том, что общий элемент не анимируется так, как должен, вместо этого он анимируется вместе со всем переходом входа и выхода макета.

gif-анимация

здесь страховой текст должен анимироваться отдельно от всей анимации.

Анимация действий при вызове выглядит следующим образом:

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, но упомянутое там решение не сработало для меня. если это проблема, описанная выше, то макет для второго действия выглядит следующим образом:

    <?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>

Любая помощь будет высоко ценится


person Teo Mehrosh    schedule 18.11.2016    source источник
comment
Также следуйте этому руководству для одного элемента перехода. По-прежнему сталкивался с той же проблемой halfthought.wordpress. com/2014/12/08/   -  person Teo Mehrosh    schedule 18.11.2016
comment
Пожалуйста, объясните, чего именно вы пытаетесь достичь и что в настоящее время не работает (желательно с видео/gif).   -  person Xaver Kapeller    schedule 19.11.2016
comment
Отредактировал ответ. Добавлена ​​анимация и комментарий под ней о требовании @XaverKapeller.   -  person Teo Mehrosh    schedule 23.11.2016


Ответы (1)


Решенная проблема Проблема была в основном из-за проблемы с синхронизацией анимации. Общий элемент анимировался намного быстрее (значение по умолчанию) по сравнению с анимацией других окон. Изменен метод 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.com и блог Джорджа Маунта чтобы узнать больше о переходах между общими элементами.

Примечание. Существует ошибка Google для возврата текстового представления общего элемента обратно в вызывающая активность, которая до настоящего времени не разрешена. поэтому пришлось отключить переход возврата общего элемента из вызывающей активности.

person Teo Mehrosh    schedule 28.11.2016