web-dev-qa-db-ja.com

複数の共有要素

サッカーのアプリケーション内で次のような状況が発生しました。
これらすべてのアクティビティ間で共有要素を実装したいと考えています。

Shared Elements Situation

一致の最初の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番目のImageViewActivityに対応します

<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から壊れます。

視力。誰かがこれを理解するのに少し時間がかかることを願っています。

前もって感謝します

14
tim

疑いの余地はありませんが、問題は、共有するビューのtransitionNameを2番目のActivityから3番目に変更しているためです。ただし、そのtransitionNameを2番目のActivityに保持し、ビューのtransitionNamethirdActivityonCreateメソッドで、2番目のActivityから共有する内容に応じて変更する必要があります。

それでは、期待どおりに機能しているので、最初のActivityから2番目への遷移を維持しましょう。 2番目のActivityを見てみましょう。共有したいビューのtransitionNameIntentの追加として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);
    }
}

その結果、次のようなものがあります(アクティビティ間の違いをよりよく理解するために、爆発遷移を使用しました)。

enter image description here

それがあなたが望むものとまったく同じように役立つことを願っています! :)

11
rom4ek

私自身もこの疑問を持っていましたが、上記の答えは少し混乱しているように感じます。アニメーション化する共有要素が複数ある場合は簡単に言えば、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());
8