Введите переход на фрагменте с общим элементом, нацеленным на общий элемент

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

Однако enterTransition применяется к общему элементу, поэтому он исчезает с остальными представлениями. Если я не устанавливаю enterTransition, то изображение перемещается правильно, но во время его перемещения другой контент уже виден.

Как заставить его не применять enterTransition к общему представлению?

Я нашел эту фиксацию в AOSP, которая, похоже, должна решить эту проблему, но это не так. кажется, не работает.

Вот пример кода:

public class Fragment1 extends Fragment {

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
                           Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.main_fragment, container, false);
    final ImageView imageView = (ImageView) rootView.findViewById(R.id.image);
    final Button button = (Button) rootView.findViewById(R.id.button);

    button.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        TransitionSet transitionSet = new TransitionSet();
        transitionSet.addTransition(new ChangeImageTransform());
        transitionSet.addTransition(new ChangeBounds());
        transitionSet.setDuration(300);

        Fragment fragment2 = new Fragment2();
        fragment2.setSharedElementEnterTransition(transitionSet);
        fragment2.setSharedElementReturnTransition(transitionSet);
        Fade fade = new Fade();
        fade.setStartDelay(300);
        fragment2.setEnterTransition(fade);

        getFragmentManager().beginTransaction()
            .replace(R.id.container, fragment2)
            .addSharedElement(imageView, "SharedImage")
            .commit();
      }
    });
    return rootView;
  }
}

person Spencer    schedule 13.11.2014    source источник


Ответы (1)


Переход ввода не должен применять представления общих элементов. Наиболее вероятный сценарий заключается в том, что ваш общий элемент находится в другом представлении с фоном, из-за чего на это представление влияет переход ввода. Вот такая ситуация:

<FrameLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#FFF"
    >
    <ImageView android:src="@drawable/pretty_picture"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:transitionName="picture"
        android:padding="20dp"/>
</FrameLayout>

Здесь ImageView является общим элементом.

Если это произойдет, вы захотите добавить волшебный переход: ChangeTransform. Если он обнаружит, что родитель изменился, он извлечет общий элемент из родителя и перенесет его отдельно.

person George Mount    schedule 13.11.2014
comment
Джордж, я могу поцеловать тебя! Это устраняет мою проблему с моими представлениями, которые всегда начинают свою анимацию с верхней части экрана во втором фрагменте, а не с того места, где они были расположены в 1-м фрагменте. Вот ссылка на мой вопрос (это тонна комментариев) спасибо! stackoverflow.com/questions/26950801/ - person brockoli; 30.11.2014
comment
Джордж, так изначально предполагалось использовать ChangeTransform? Или его конкретная реализация просто покрывает этот случай? Кажется почти произвольным, что использование ChangeTransform волшебным образом все исправит. Есть ли причина, по которой ChangeBounds, ChangeImageTransform и т. д. также не реализованы для покрытия этого случая? - person Alex Lockwood; 28.12.2014
comment
да. Переходы обычно анимируют небольшой набор свойств, поэтому переходы можно комбинировать по желанию. Нам нужно было обработать случай, когда родительский и дочерний элементы переходят отдельно. Поскольку для этого требуется анимация одних и тех же свойств, нам пришлось объединить, казалось бы, разные переходы. - person George Mount; 28.12.2014
comment
@GeorgeMount Не могли бы вы подробнее рассказать об ответе? Должно ли преобразование изменения применяться к общему элементу или его родителю? - person Aadithya; 05.12.2016
comment
@GeorgeMount У меня есть ImageView, который является общим элементом, у меня нет обернутого макета кадра, как указано выше, и я также использую ChangeTransform. Все прекрасно играет. Моя проблема в том, что я пытаюсь установить для своего ImageView значение GONE в onTransitionEnd, но это не работает, я пытаюсь отладить и вижу, что флаг видимости все еще ВИДИМ. Итак, я пытаюсь поместить свой ImageView внутри FrameLayout, как указано выше, и переключать изменения видимости в FrameLayout, и это работает. Любые идеи, почему это работает? Спасибо - person Nhat Pham; 04.09.2018