4

我有一个带有图像的 RecyclerView,当我按下图像时,应用程序会打开另一个包含 ViewPager 的活动,该 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

首先要做的是确保视图在没有任何 Activity 转换的情况下正常工作。也就是说,当您使用 ViewPager 从 Activity 返回时,RecyclerView Activity 应该显示 ViewPage 正在显示的 View。当您调用 ViewPager 活动时,使用 startActivityForResult 并使用结果将 RecyclerView 滚动到正确的位置。

一旦它起作用,就可以使活动转换起作用。我知道你给 RecyclerView 中的每个 View 赋予了不同的 transitionName,对吧?绑定视图时,调用 setTransitionName 并为其指定一个可重复的名称。通常这是图像 URL 或光标行 ID,或者最坏的情况是一些像“image_”+ 索引这样的混合索引。

您需要做的下一件事是为调用活动(退出)和被调用活动(进入)设置 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 提供了专门针对这种情况的新功能。您可以在被调用的 Activity 完成之前查看结果。

于 2015-04-09T00:12:09.823 回答