8

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 つの異なるトランジション セッターがあります。

  1. setSharedElementEnterTransitionコンテンツ Scene に転送される共有要素に使用される Transition を設定します。
  2. setSharedElementReturnTransitionバック スタックの pop中に転送される共有要素に使用される Transition を設定します。
  3. setEnterTransitionビューを最初のシーンに移動するために使用されるトランジションを設定します。
  4. setExitTransitionバック スタックをポップしないときに、フラグメントが削除、非表示、またはデタッチされたときに、シーンからビューを移動するために使用される遷移を設定します。
  5. setReenterTransitionバック スタックのポップにより戻るときにビューをシーンに移動するために使用されるトランジションを設定します。

私のメソッドが呼び出されると、次のプロパティを使用して からにsetFragment遷移するアニメーションが再生されます。mCurrentFragmentnewFragment

  • SharedElementEnterTransitionは、共有要素newFragmentが にどのように遷移するかを定義します。 (私の場合、クリックされた項目の CardView が展開され、それに含まれる TextView の 1 つが移動されます)newFragment
  • newFragmentEnterTransition は、共有要素ではない残りの子ビューが画面に遷移する方法を定義newFragmentます。 (私の場合、ツールバーは画面の下部にフェードインします。実際には、ツールバーは既存の RecyclerView の後ろにフェードインしています。前にあるように交換する方法はありますか?)
  • mCurrentFragmentExitTransition は、共有要素ではない子mCurrentFragmentビューが画面から遷移する方法を定義します。 (私の場合、RecyclerView のみが含まれているため、残りの RecyclerView 要素がバックグラウンドでフェードアウトするという効果があります)
    mCurrentFragment

BackStack がポップされると、次のことが起こると予想されます。

  • の SharedElementReturnTransitionは、共有要素が に戻るmCurrentFragment方法を定義します。 (私の場合、CardView は RecyclerView アイテムのサイズに縮小され、それに含まれる TextView は元に戻されます)。mCurrentFragment
  • の ExitTransition は、共有要素ではない子ビューが画面から遷移newFragmentする方法を定義します。 (私の場合、一番下のツールバーがフェードアウトします)newFragment
  • の ReenterTransition は、共有要素ではないmCurrentFragment残りのmCurrentFragment子ビューが画面に戻る方法を定義します。 (私の場合、他の RecyclerView アイテムはフェードインするはずですが、これは起こっていません。移行中の共有要素の背後に即座に表示されます)。

私は何か誤解しましたか?

4

0 に答える 0