Переход общего элемента между замененными представлениями

У меня есть представление, которое я удаляю с помощью removeView(), а затем представление, которое заменяет его на addView(). Оба эти представления находятся внутри FrameLayout. Я хотел бы иметь возможность сделать переход общего элемента между двумя общими изображениями в этих макетах, но на самом деле не знаю, как это сделать, поскольку инструменты Android, похоже, построены с (возможно, разумной) идеей, что вы будете имеют только переходы общих элементов между действиями или фрагментами.

Моя лучшая идея на данный момент - сделать собственную попытку анимации. Я бы сделал это, нарисовав копию изображения на viewOverlay, удалив первый вид, добавив видимый второй вид, анимировав его в позицию во втором представлении, а затем сделав второй вид видимым. Я собираюсь попробовать этот маршрут и ответить на свой вопрос, если он работает, но я надеялся найти более естественный способ сделать это.


person Ryan C    schedule 10.08.2015    source источник


Ответы (1)


Моя идея попробовать свою собственную анимацию была определенно неправильным путем (хотя это сработало). Я обнаружил, что в некоторых отношениях иметь общий контент на самом деле проще, если у вас есть заменяемые представления. Большая часть документации посвящена использованию переходов с действиями и фрагментами, но по своей сути они построены на изменении представлений.

Этот пост http://blog.stylingandroid.com/transition-animation-part-1/ мне очень помог.

По сути, что я делаю, это:

            // above I've gotten the sharedElements (Views)...
            newSharedElement.setTransitionName("sharedProperty");
            oldSharedElement.setTransitionName("sharedProperty");
            // having android:transitionName in the xml can be easier

            // This transition handles the shared element move based on the shared tansition name
            Transition shared = TransitionInflater.from(context).inflateTransition(android.R.transition.move);
            shared.addTarget(newSharedElement);

            // create a scene container is a parentView (FrameLayout) of both children
            Scene scene = new Scene(container, newChild);

            // everything else is set to Fade, shared element is excluded
            Transition fade = TransitionInflater.from(context).inflateTransition(android.R.transition.fade);
            fade.excludeTarget(newSharedElement, true);

            // combine the translations
            TransitionSet set = new TransitionSet();
            set.addTransition(shared).addTransition(fade);

            // translationize
            TransitionManager.go(scene, set);

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

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

person Ryan C    schedule 11.08.2015