RecyclerViewで選択したアイテムから新しいフラグメントに2つの単純なビューをアニメーション化しようとしています。あるアクティビティから別のアクティビティに共有要素をアニメーション化する例をたくさん見てきましたが、同じアクティビティ内のあるフラグメントから別のフラグメントに共有要素をアニメーション化する例はほとんどありません。それはほとんど機能します。
これが私の構造です。
アクティビティ
--RecyclerViewを備えたフルスクリーンFragment1
-詳細を含むフルスクリーンFragment2
ユーザーがFragment1のRecyclerViewでアイテムを選択すると、Fragment1を、さまざまな位置とサイズの共有要素を持つビューを持つFragment2に置き換えます。
それを機能させるには少しトリックがあります。transitionNameがリスト内のアイテムごとに一意であることを確認する必要があります。もちろん、アニメーションを再生するには、transitionNameがFragment2の要素のtransitionNameと一致している必要があります。この部分は機能しています。アイテムを選択すると、2つの共有ビューがアニメーション化されますが、2つのアクティビティ間で実行した場合の期待どおりではありません。
画面の下部にあるアイテムを選択すると、Fragment2のビューが描画され、画面の上部にあるアイテムにあるかのように2つの共有ビューがアニメーション化されます。説明するのは難しい。ここにいくつかの写真があります
フラグメント1
フラグメント2
両方のフラグメントで、次のように設定しています
setSharedElementEnterTransition(new ChangeBounds());
setSharedElementReturnTransition(new ChangeBounds());
setAllowEnterTransitionOverlap(true);
setAllowReturnTransitionOverlap(true);
また、onCreate()の親アクティビティで設定しました
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
共有要素のアニメーションが、画面の下部にある選択したアイテムで開始されていても、画面の上部から開始される理由はありますか?
ついにこの問題を解決しました! 2つのフラグメント間で共有しているビューは、2番目のフラグメントの別のビュー(RelativeLayout)の子であることが判明したため、TransitionSetにChangeTransformトランジションを追加する必要があります。どうやらChangeTransformは、2番目のフラグメントの新しい位置にアニメーション化する前に、1番目のフラグメントのビューの元の位置を記憶するようにシステムに指示しているようです。これが私の更新されたtransitionSetです。また、テストプロジェクトのコードを少しクリーンアップし、後から他の人に役立つ場合に備えて、bitbucketに最後のプッシュを行います。この1つのアレックスのすべての助けに感謝し、この解決策のヒントを私に落とした誰かの同様の質問に答えてくれた@ George-mountに感謝します。
<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:Android="http://schemas.Android.com/apk/res/Android">
<changeTransform/>
<changeBounds/>
</transitionSet>