サッカーのアプリケーション内で次のような状況が発生しました。
これらすべてのアクティビティ間で共有要素を実装したいと考えています。
一致の最初のActivity
のビューホルダーで、2番目のActivity
の同じtransitionNameに対応するAndroid:transitionName
を設定しました。
<!-- 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" />
2番目の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());
このtransitionNameは、3番目の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から壊れます。
視力。誰かがこれを理解するのに少し時間がかかることを願っています。
前もって感謝します
疑いの余地はありませんが、問題は、共有するビューのtransitionName
を2番目のActivity
から3番目に変更しているためです。ただし、そのtransitionName
を2番目のActivity
に保持し、ビューのtransitionName
をthirdActivity
のonCreate
メソッドで、2番目のActivity
から共有する内容に応じて変更する必要があります。
それでは、期待どおりに機能しているので、最初のActivity
から2番目への遷移を維持しましょう。 2番目のActivity
を見てみましょう。共有したいビューのtransitionName
をIntent
の追加として3番目のActivity
に送信し、この値プログラムで3番目のActivity
の共有ビューに。
これがsecondActivity
のコードです:
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
で新しいアクティビティが開始されます。
そして、thirdActivity
で、これを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);
}
}
その結果、次のようなものがあります(アクティビティ間の違いをよりよく理解するために、爆発遷移を使用しました)。
それがあなたが望むものとまったく同じように役立つことを願っています! :)
私自身もこの疑問を持っていましたが、上記の答えは少し混乱しているように感じます。アニメーション化する共有要素が複数ある場合は簡単に言えば、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());