将重新输入动画更改为列表中的另一个项目

jek*_*ena 3 android android-5.0-lollipop activity-transition shared-element-transition

我有一个带有图像的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();
}
Run Code Online (Sandbox Code Playgroud)

但它返回到调用活动列表中原始图像的相同位置.

如何使图像返回其在调用活动列表中的位置?

Geo*_*unt 6

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

一旦工作,可以使活动过渡工作.我知道你已经在RecyclerView中为每个View提供了一个不同的transitionName,对吧?绑定View时,调用setTransitionName并为其指定可重复的名称.通常,这是图像URL或光标行ID,或者最糟糕的是一些像"image_"+ index这样的munged索引.

您需要做的下一件事是为调用Activity(退出)和被调用活动(enter)设置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);        
}
Run Code Online (Sandbox Code Playgroud)

这里,mSharedElement已设置在调用(RecyclerView)活动中的onActivityReenter和onCreate中以及调用(ViewPager)活动中的finishAfterTransition(onBackPressed?)之前.

onActivityReenter专门为此案例提供了新功能.您可以在调用的Activity完成之前查看结果.