19

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

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

активность

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

- Полный экран FRAGMENT2 с деталями

Когда пользователь выбирает элемент в 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); 

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

+0

Я не уверен, я понимаю, что вы пытаетесь достичь. Я предполагаю, что странные желтые/синие полосы - это те взгляды, которые вы имеете в виду? Итак, в первом скриншоте вы нажимаете на элемент, и вы ожидаете, что две соответствующие желтые/синие полосы ожидают расположение желтых/синих полос во втором фрагменте ... но что происходит вместо этого? Что вы имеете в виду "...он рисует представление для Fragment2 и анимирует 2 общих представления, как если бы они находились в элементе в верхней части экрана »? Также, что представляют собой стрелки на втором скриншоте? –

+0

Кстати, если вы используете Android Studio, вы можете довольно легко взять захват экрана вашего приложения (см. [** эти инструкции **] (https://developer.android.com/sdk/installing/studio-debug.html#screenCap)) и загрузить его на YouTube (I знаю, что проблема должна быть сложной) –

+0

Последний вопрос: происходит ли это только при выборе элементов в нижней части экрана? Например, будет ли он работать как ожидалось для элементов вверху? –

ответ

35

Окончательно решена эта проблема! Как оказалось, поскольку представление, которое я разделяю между двумя фрагментами, является дочерним элементом другого представления (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

+0

Huh ... ничего себе. Рад, что ты наконец понял это. Определенно не ожидал, что это решение. :) –

+0

это работает, вы сэкономили много времени для меня :) –

+0

после долгих разрывов, это решило. Спасибо, что поделился! –