web-dev-qa-db-ja.com

共有要素を持つフラグメントに遷移を入力して、共有要素をターゲットにします

新しいLollipopapiをフラグメントのsetEnterTransitionに使用してから、フラグメント内の画像の共有要素遷移を追加しています。望ましい動作は、最初に画像がその位置に移動し、その後、フラグメント内の残りのビューがフェードインすることです。

ただし、enterTransitionは共有要素に適用されているため、残りのビューでフェードインしています。 enterTransitionを設定しないと、画像は正しく移動しますが、移動中は他のコンテンツが既に表示されます。

EnterTransitionを共有ビューに適用しないようにするにはどうすればよいですか?

AOSPでのこのコミット この問題に対処する必要があるようですが、機能していないようです。

サンプルコードは次のとおりです。

public class Fragment1 extends Fragment {

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
                           Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.main_fragment, container, false);
    final ImageView imageView = (ImageView) rootView.findViewById(R.id.image);
    final Button button = (Button) rootView.findViewById(R.id.button);

    button.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        TransitionSet transitionSet = new TransitionSet();
        transitionSet.addTransition(new ChangeImageTransform());
        transitionSet.addTransition(new ChangeBounds());
        transitionSet.setDuration(300);

        Fragment fragment2 = new Fragment2();
        fragment2.setSharedElementEnterTransition(transitionSet);
        fragment2.setSharedElementReturnTransition(transitionSet);
        Fade fade = new Fade();
        fade.setStartDelay(300);
        fragment2.setEnterTransition(fade);

        getFragmentManager().beginTransaction()
            .replace(R.id.container, fragment2)
            .addSharedElement(imageView, "SharedImage")
            .commit();
      }
    });
    return rootView;
  }
}
20
Spencer

Enterトランジションは、共有要素ビューを適用しないでください。最も可能性の高いシナリオは、共有要素が背景のある別のビュー内にあり、そのビューが入力遷移の影響を受けることです。これは次のような状況です。

<FrameLayout
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:background="#FFF"
    >
    <ImageView Android:src="@drawable/pretty_picture"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:transitionName="picture"
        Android:padding="20dp"/>
</FrameLayout>

ここで、ImageViewは共有要素です。

その場合は、魔法のトランジションChangeTransformを追加することをお勧めします。親が変更されたことを検出すると、親から共有要素を引き出し、個別に移行します。

25
George Mount