ViewPager片段 – 共享元素转换

我正在开发的应用程序显示图像的网格。 当你点击一个图像,它进入细节视图。 详细信息视图包含一个ViewPager,允许您在网格中的每个图像之间滑动。 这是通过传递path列表(包含网格中的每个图像),以及点击图像的偏移量,以便ViewPager可以设置为初始显示该页面来完成的。

在ViewPager的当前偏移量页面的片段内部有一个共享元素转换的最佳方式是什么? 网格(RecyclerView)图像应展开为当前页面中的全屏图像。 我看到了推迟和恢复活动转换的能力,所以应用程序将等待显示共享元素转换,直到从磁盘加载图像。 但是我希望能够使视图寻呼机中正确的页面变成animation,并且在用户返回时(因为您可以在页面之间滑动)而退出到当前页面。 如果你现在刷到不同的页面,最初的页面是什么animation回到网格。

目前,我使用格式为“image_ [index]”的transitionName为视图分页器的片段中的每个图像分配一个。 当我开始细节活动时,我使用相同的transitionName,索引是偏移量。

与此相关,我也想知道如何使长时间的按下涟漪。 当您更改视图的激活状态时,似乎取消了波纹。 我想要一个类似于Gmail的效果,纹波重新开始,并在长按完成后快速结束并触发激活状态。

Solutions Collecting From Web of "ViewPager片段 – 共享元素转换"

从我可以告诉(并纠正我,如果我错了),你想要实现的基本上是这样的:假设你有一个MainActivity ,一个DetailsActivity ,和一组任意的图像。 MainActivity在网格中显示一组图像,并且DetailsActivity在水平ViewPager显示相同的一组图像。 当用户在MainActivityselect一个图像时,该图像应该从网格中的位置转换到第二个活动的ViewPager正确的页面。

我们想要解决的问题是“如果用户在DetailsActivity切换页面怎么办? 如果发生这种情况,我们要更改在返回转换过程中使用的共享映像。 默认情况下,活动转换框架将使用在转换过程中使用的共享元素…但视图页面的页面已经改变,所以显然我们想以某种方式覆盖这种行为。 为此,我们需要在MainActivityDetailsActivityonCreate()方法中设置SharedElementCallback ,并覆盖onMapSharedElements()方法,如下所示:

 private final SharedElementCallback mCallback = new SharedElementCallback() { @Override public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) { if (mCurrentImagePosition != mOriginalImagePosition) { View sharedView = getImageAtPosition(mCurrentImagePosition); names.clear(); sharedElements.clear(); names.add(sharedView.getTransitionName()); sharedElements.put(sharedView.getTransitionName(), sharedView); } } /** * Returns the image of interest to be used as the entering/returning * shared element during the activity transition. */ private View getImageAtPosition(int position) { // ... } }; 

为了获得更完整的解决scheme,我在GitHub上创build了一个实现这种效果的示例项目 (在单个StackOverflow答案中发布的代码太多)。

我假设你正在使用片段转换,并且你没有在活动之间进行animation处理。 在活动转换和片段转换中都是可能的,但具体代码有点不同。 尽pipe如此,延期在片段转换上不可用。

addSharedElement接受第二个参数。 如果在调用目标片段时知道目标片段中的特定名称,则可以select要使用的详细片段中的名称。 如果你不这样做,你可以select你想要的任何名字,并使用Fragment上设置的SharedElementCallback重新映射它。

 fragment.setEnterSharedElementCallback(new SharedElementCallback() { @Override public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) { sharedElements.put("detailView", mTargetDetailView); } }); 

如果它在回来的时候不匹配,则重新调用相同的调用。 这可能会在调用片段和被调用片段中 – 在调用片段中,您使用setExitSharedElementCallback。 我希望你的应用程序就是这种情况。

同样,在活动转换中,您设置相同的SharedElementCallback并使用相同的映射,但是您在Activity上执行。