Несколько общих элементов

У меня есть следующая ситуация внутри приложения для футбола.
Мы хотим реализовать общие элементы между всеми этими действиями.

Общие ситуации элементов

В моем наблюдателе на первом Activity для совпадения я установил android:transitionName, который соответствует одному и тому же имени перехода на втором Activity.

<!-- item_viewholder (first activity) -->
<CustomViewContainingImageViewAndTextView
     android:id="@+id/item_match_hometeam"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:transitionName="@string/transition_morph_match_header_homeTeam" />

<!-- header (second activity) -->
<CustomViewContainingImageViewAndTextView
     android:id="@+id/item_match_hometeam_header"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:transitionName="@string/transition_morph_match_header_homeTeam" />

Я начинаю второй Activity с

final String awayTeamTransition = activityContext.getString(R.string.transition_morph_match_header_awayTeam);
final String homeTeamTransition = activityContext.getString(R.string.transition_morph_match_header_homeTeam);
final ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(
                   activityContext,
                   Pair.create(homeTeam, homeTeamTransition),
                   Pair.create(awayTeam, awayTeamTransition));
activityContext.startActivity(intent, options.toBundle());

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

Я попытался установить программный код transitionName, когда CustomViewContainingImageViewAndTextView был нажат на новый transitionName.

final String teamViewTransition = activityContext.getString(R.string.transition_morph_teamview_to_detail);
//teamView is the view that was clicked.
ViewCompat.setTransitionName(teamView, teamViewTransition);

final ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(
     activityContext,
     Pair.create(teamView, teamViewTransition));
activityContext.startActivity(teamInfoActivityIntent, options.toBundle());

этот переходName соответствует ImageView на третьем Activity

<ImageView
   android:id="@+id/team_info_header_logo"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:transitionName="@string/transition_morph_teamview_to_detail" />

Однако enterTransition не удается, но exitTransition работает!
Однако это прерывает exitTransition от 2 → 1

Sight. Надеюсь, что кто-то займет некоторое время, чтобы понять это.

Заранее спасибо

Ответ 1

Помимо любых сомнений, проблема заключается в том, что вы меняете transitionName представления, которое хотите разделить со второго Activity на третье. Но вы должны просто сохранить это transitionName во втором Activity, но изменить transitionName в представлении в третьем Activity onCreate методе, в соответствии с тем, что мы хотим разделить со второго Activity.

Итак, пусть наш переход от первого Activity ко второму, так как он работает как ожидалось. Давайте посмотрим на второй Activity: нам просто нужно отправить transitionName вид, который мы хотим разделить как дополнительный Intent на третий Activity, а затем назначить это значение программно для общего представления в третьем Activity.

Итак, вот код нашего второго Activity:

View homeTeam = findViewById(R.id.home_team_detail);
View awayTeam = findViewById(R.id.away_team_detail);

View.OnClickListener onTeamClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Activity activityContext = MultipleElementsDetail.this;
        final ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(
                activityContext,
                Pair.create(v, v.getTransitionName()));
        startActivity(new Intent(activityContext, SingleElementDetail.class)
           .putExtra("shared_element_transition_name", v.getTransitionName()), options.toBundle());
    }
};

homeTeam.setOnClickListener(onTeamClickListener);
awayTeam.setOnClickListener(onTeamClickListener);

Итак, я сделал здесь только те же OnClickListener для обеих команд, которые создают общий переход, и запускает новое действие с Intent с transitionName общего представления в качестве дополнительного.

И затем в третьем Activity я просто добавлю это значение из Intent и задаю его как transitionName общего вида:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_single_element_detail);

    View team = findViewById(R.id.team_single);

    String transitionName = getIntent().getStringExtra("shared_element_transition_name");
    if (!TextUtils.isEmpty(transitionName)) {
        ViewCompat.setTransitionName(team, transitionName);
    }
}

И в результате у нас есть что-то вроде этого (я использовал переход от смены, чтобы лучше видеть разницу между действиями):

введите описание изображения здесь

Надеюсь, что это поможет и точно так же, как вы хотите!:)

Ответ 2

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

    Pair statusAnim = Pair.create(holder.getOrderStatusView(), "track_job_status");
    Pair driverBundleAnim = Pair.create(holder.getDriverProfileBundle(), "driver_profile_bundle");
    ActivityOptions transitionActivityOptions = ActivityOptions.makeSceneTransitionAnimation((Activity) context, statusAnim, driverBundleAnim);
    context.startActivity(new Intent(context, TrackingActivity.class), transitionActivityOptions.toBundle());