Общие элементы, анимация между фрагментами
Я пытаюсь анимировать 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);
Любая идея, почему мои общие анимации элементов начинаются в верхней части экрана даже тогда, когда они запускались в выбранном элементе в нижней части экрана?
Ответы
Ответ 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