4

画像を含む RecyclerView があり、画像を押すと、アプリは同じ画像を持つ ViewPager を含む別のアクティビティを開きますが、選択した位置にあります。

Lollipop でトランジションを実行し、呼び出されたアクティビティで supportPostponeEnterTransition と supportStartPostponedEnterTransition を使用してアクティビティ間でこの画像を共有し、viewPager に画像がロードされてトランジションが開始されるまで待機しました。

呼び出されたアクティビティに入ると、トランジションは問題ありません。

私が直面している問題は、呼び出されたアクティビティの ViewPager で別の画像に移動すると、現在選択されている画像ではなく、最初に選択された画像がアニメーション化されることです。

これにより、アニメーション画像を、呼び出されたアクティビティで選択されたものに変更できました。

@Override
public void onBackPressed() {
  View view = ((ImageDetailFragment) adapter.getFragment(viewPager,
      viewPager.getCurrentItem())).getTransitionView();

  ViewCompat.setTransitionName(view, Constants.TRANSITION_IMAGE);
  super.onBackPressed();
}

ただし、呼び出しアクティビティのリスト内の元の画像の同じ位置に戻っています。

呼び出しアクティビティのリスト内の位置に画像を戻すにはどうすればよいですか?

4

1 に答える 1

6

最初に行うことは、ビューがアクティビティの遷移なしで適切に機能することを確認することです。つまり、ViewPager を使用してアクティビティから戻ると、RecyclerView アクティビティは、ViewPage が表示していたビューを表示する必要があります。ViewPager アクティビティを呼び出すときは、startActivityForResult を使用し、その結果を使用して RecyclerView を正しい位置にスクロールします。

それが機能したら、Activity Transition を機能させることができます。RecyclerView の各ビューに異なる transitionName を指定したことは知っていますよね? ビューをバインドするときは、setTransitionName を呼び出して、繰り返し可能な名前を付けます。通常、これは画像 URL またはカーソル行 ID、または最悪の場合、"image_" + index のような変更されたインデックスです。

次に行う必要があるのは、呼び出し元のアクティビティ (終了) と呼び出されたアクティビティ (開始) の両方に SharedElementCallback を設定することです。それぞれで、 onMapSharedElements コールバックをオーバーライドして、共有要素を再マップする必要があります。

@Override
public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {
    // assuming just one shared element, excuse the ugly code
    sharedElements.put(names.get(0), mSharedElement);        
}

ここで、mSharedElement は、呼び出し (RecyclerView) アクティビティの onActivityReenter と、呼び出された (ViewPager) アクティビティの onCreate および finishAfterTransition (onBackPressed?) の前に設定されています。

onActivityReenter は、このケース専用の新しい機能を提供します。呼び出されたアクティビティが完了する前に、そこで結果を見ることができます。

于 2015-04-09T00:12:09.823 に答える