20

RecyclerView で選択したアイテムから新しいフラグメントに 2 つの単純なビューをアニメーション化しようとしています。あるアクティビティから別のアクティビティに共有要素をアニメーション化する例をたくさん見てきましたが、同じアクティビティ内であるフラグメントから別のフラグメントに共有要素をアニメーション化する例はほとんどありません。それはほとんど動作します。

これが私の構造です。

アクティビティ

-- RecyclerView を使用したフルスクリーン Fragment1

-- フルスクリーン Fragment2 と詳細

ユーザーが Fragment1 の RecyclerView 内のアイテムを選択すると、Fragment1 を Fragment2 に置き換えます。この Fragment2 には、共有要素が異なる位置とサイズで含まれる View があります。

それを機能させるにはちょっとしたコツがあります。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);

共有要素のアニメーションが、画面の下部にある選択したアイテムで開始されているのに、画面の上部から開始される理由は何ですか?

4

1 に答える 1

38

Finally solved this problem! As it turns out because the view I'm sharing between 2 fragments is a child of another view (RelativeLayout) in the 2nd fragment, you need to add the ChangeTransform transition to your TransitionSet. Apparently ChangeTransform tells the system to remember the views original position in the 1st fragment before animating to the new position in the 2nd fragment. Here is my updated transitionSet. I'll also clean up my test project code a bit and make a final push to bitbucket in case it will help others after me. Thanks for all the help with this one Alex and thank you to @George-mount for answering someones similar question that dropped the hint to me for this solution.

<?xml version="1.0" encoding="utf-8"?>

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
    <changeTransform/>
    <changeBounds/>
</transitionSet>

https://bitbucket.org/brockoli/fragmentsharedelements

于 2014-11-30T14:28:47.943 に答える