Переход на общий элемент Android: представление героя обращается к другому

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

[Видео ссылка больше не работает]

Как вы видите, изображение просматривается перед вкладками.

То, что я ожидаю, это вкладки, которые нарисованы в шрифте на изображении и исчезают во время перехода (так что в конце анимации они исчезли).

Единственное, что работает, это установить windowSharedElementsUseOverlay в true, но у этого есть другие уродливые эффекты, так что, похоже, это не вариант.

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


код: Я начинаю детальное действие следующим образом:

options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, pairs);
ActivityCompat.startActivity(activity, subActivity, options.toBundle());

Ответ 1

Я считаю, что вам может понадобиться исключить, а не включать макет вкладки из анимации перехода.

Итак, в onCreate активности вашего списка включите:

Transition fade = new Fade();
fade.excludeTarget(R.id.tab, true); // use appropriate id for you tab
getWindow().setExitTransition(fade);
getWindow().setEnterTransition(fade); // try getWindow().setReenterTransition(fade); instead

Определенно взгляните на ответ Алекс Локвуд на Как предотвратить отображение строки состояния и навигационной панели во время перехода анимации сцены активности?, где он дает больше и более углубленное, но усваиваемое объяснение по этой теме. Вы также можете рассмотреть возможность добавления/внедрения решения в этом сообщении.

Ответ 2

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

Я исправил проблему довольно элегантно, просто добавив вкладку "dummy" tablayout и панель инструментов "dummy" в моей вызываемой деятельности. Элементы "dummy" не отображаются, поэтому это не влияет на макет моей вызываемой активности, но эффект перехода будет работать правильно, если вы добавите их.

                <android.support.v7.widget.Toolbar
                    android:id="@+id/toolbar2"
                    android:transitionName="toolbar"
                    android:visibility="gone"
                    android:layout_width="match_parent"
                    android:layout_height="?attr/actionBarSize" />

                <android.support.design.widget.TabLayout
                    android:id="@+id/sliding_tabs"
                    android:layout_width="match_parent"
                    android:layout_height="60dp"
                    android:visibility="gone"
                    android:transitionName="tab"
                    ></android.support.design.widget.TabLayout>

Затем я добавил tablayout и панель инструментов в качестве пары в моем переходе:

        Pair<View, String> p4 = Pair.create(getActivity().findViewById(R.id.sliding_tabs), "tab");
        Pair<View, String> p5 = Pair.create(getActivity().findViewById(R.id.toolbar), "toolbar");
        Bundle options = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(), p1, p2, p3, p4, p5).toBundle();

Ответ 3

Вы должны попробовать следующее:

При выходе из операции вызовите getWindow(). SetExitTransition (null);

В процессе ввода вызовите getWindow(). setEnterTransition (null);

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