Подтвердить что ты не робот

Общие элементы, анимация между фрагментами

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

Вот моя структура.

Деятельность

- Полный экран Fragment1 с RecyclerView

- Полноэкранный фрагмент2 с подробностями

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

Там немного хитрости, чтобы заставить его работать, вы должны убедиться, что ваше имя перехода уникально для каждого элемента в вашем списке, и, конечно, что имя перехода должно совпадать с именем перехода из элемента Fragment2 для воспроизведения анимации, У меня есть эта часть работы, когда я выбираю элемент, 2 общих представления делают анимацию, просто не совсем точно, как вы могли бы ожидать, когда делаете это между двумя действиями.

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

Fragment1 Select item near bottom of list

FRAGMENT2 I would expect the blue line to animate from the bottom to the top, but it starts at the top and only grows horizontaly, the yellow line I would expect to stay near the bottom but grow horizontally, but it starts at the top of the screen and animates down

В обоих фрагментах я устанавливаю следующие

        setSharedElementEnterTransition(new ChangeBounds());
        setSharedElementReturnTransition(new ChangeBounds());
        setAllowEnterTransitionOverlap(true);
        setAllowReturnTransitionOverlap(true);

Также в своей родительской активности в onCreate() я установил

        getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);

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

4b9b3361

Ответ 1

Наконец-то решила эту проблему! Как оказалось, поскольку представление, которое я разделяю между двумя фрагментами, является дочерним элементом другого представления (RelativeLayout) во втором фрагменте, вам нужно добавить переход ChangeTransform в ваш TransitionSet. По-видимому, ChangeTransform сообщает системе запомнить первоначальную позицию просмотров в 1-м фрагменте перед анимацией в новую позицию во втором фрагменте. Вот мой обновленный переходный набор. Я также немного очищу код своего проекта и сделаю окончательный толчок к битбакету, если он поможет другим после меня. Спасибо за всю помощь с этим Алексом и благодарю вас за @George-mount за то, что вы ответили на какой-то похожий вопрос, который бросил мне подсказку для этого решения.

<?xml version="1.0" encoding="utf-8"?>

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
    <changeTransform/>
    <changeBounds/>
</transitionSet>

https://bitbucket.org/brockoli/fragmentsharedelements