RecyclerView 内のアイテム間の Fragment トランジション アニメーションと、クリックされたアイテムの詳細を示す Fragment を実装しています。つまり、比較的一般的な...
「リスト内のカードをクリックすると、詳細ビューに展開され、残りのリストは非表示になります」
...ものの種類。
RecyclerView アイテムから詳細ビューへの遷移は正常に機能しています。残りの RecyclerView アイテムがフェードアウトする間、アイテムの共有要素は新しい状態に移行しています。
ただし、BackStack がポップされると、共有要素は元の状態に戻りますが、他の RecyclerView アイテムはフェードインしません。代わりに、このスクリーン ビデオでわかるように、アニメーションの開始時に即座に表示されます。
アクティビティはかなりの数のフラグメントを処理するため、次の一般化された方法でトランザクションを実行します。
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public void setFragment(int fragId, Bundle args, List<Pair> transitionViews,
String tag, int containerId) {
// Setup the new fragment and transaction
Fragment newFragment = FragmentFactory.newFragment(fragId, args);
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(containerId, newFragment, tag);
fragmentTransaction.addToBackStack(tag);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && transitionViews != null) {
// Add the shared elements
for (int i = 0; i < transitionViews.size(); i++) {
final Pair pair = transitionViews.get(i);
fragmentTransaction.addSharedElement((View) pair.first, (String) pair.second);
}
// Setup the transitions
Transition transitionMove = TransitionInflater.from(this).inflateTransition(android.R.transition.move);
Transition transitionFade = TransitionInflater.from(this).inflateTransition(android.R.transition.fade);
// transitionFade.setDuration(500); // Slow down the transition to help see what's happening
// Apply the relevant transitions to each fragment
newFragment.setSharedElementEnterTransition(transitionMove);
newFragment.setEnterTransition(transitionFade);
newFragment.setExitTransition(transitionFade);
mCurrentFragment.setExitTransition(transitionFade);
mCurrentFragment.setReenterTransition(transitionFade);
mCurrentFragment.setSharedElementReturnTransition(transitionMove);
}
fragmentTransaction.commit();
}
- Enter/Return でトランジションのオーバーラップを許可/禁止して遊んでみました。
- フラグメントのさまざまなトランジション設定方法で遊んでみました。
- このトピックに関する多くのブログと SO の質問を読みました。
このトピックに関するhttp://www.androiddesignpatterns.com/2014/12/activity-fragment-transitions-in-android-lollipop-part1.htmlブログを見つけました。ブロッコリーのサンプル コードは非常に役に立ちましたが、問題を解決できませんでした。問題。
おそらく、各トランジションの目的を理解するのに問題があるのでしょうか?
これが私がそれを理解する方法です。
私のmCurrentFragment
と には、newFragment
それぞれ 5 つの異なるトランジション セッターがあります。
setSharedElementEnterTransition
コンテンツ Scene に転送される共有要素に使用される Transition を設定します。setSharedElementReturnTransition
バック スタックの pop中に転送される共有要素に使用される Transition を設定します。setEnterTransition
ビューを最初のシーンに移動するために使用されるトランジションを設定します。setExitTransition
バック スタックをポップしないときに、フラグメントが削除、非表示、またはデタッチされたときに、シーンからビューを移動するために使用される遷移を設定します。setReenterTransition
バック スタックのポップにより戻るときにビューをシーンに移動するために使用されるトランジションを設定します。
私のメソッドが呼び出されると、次のプロパティを使用して からにsetFragment
遷移するアニメーションが再生されます。mCurrentFragment
newFragment
- SharedElementEnterTransitionは、共有要素
newFragment
が にどのように遷移するかを定義します。 (私の場合、クリックされた項目の CardView が展開され、それに含まれる TextView の 1 つが移動されます)newFragment
newFragment
EnterTransition は、共有要素ではない残りの子ビューが画面に遷移する方法を定義しnewFragment
ます。 (私の場合、ツールバーは画面の下部にフェードインします。実際には、ツールバーは既存の RecyclerView の後ろにフェードインしています。前にあるように交換する方法はありますか?)mCurrentFragment
ExitTransition は、共有要素ではない子mCurrentFragment
ビューが画面から遷移する方法を定義します。 (私の場合、RecyclerView のみが含まれているため、残りの RecyclerView 要素がバックグラウンドでフェードアウトするという効果があります)mCurrentFragment
BackStack がポップされると、次のことが起こると予想されます。
- の SharedElementReturnTransitionは、共有要素が に戻る
mCurrentFragment
方法を定義します。 (私の場合、CardView は RecyclerView アイテムのサイズに縮小され、それに含まれる TextView は元に戻されます)。mCurrentFragment
- の ExitTransition は、共有要素ではない子ビューが画面から遷移
newFragment
する方法を定義します。 (私の場合、一番下のツールバーがフェードアウトします)newFragment
- の ReenterTransition は、共有要素ではない
mCurrentFragment
残りのmCurrentFragment
子ビューが画面に戻る方法を定義します。 (私の場合、他の RecyclerView アイテムはフェードインするはずですが、これは起こっていません。移行中の共有要素の背後に即座に表示されます)。
私は何か誤解しましたか?