Несколько общих элементов
У меня есть следующая ситуация внутри приложения для футбола.
Мы хотим реализовать общие элементы между всеми этими действиями.
![Общие ситуации элементов]()
В моем наблюдателе на первом 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());