如何处理共享元素的 return 过渡?

How to handle return transition with shared elements?

我想实现自定义 Pre-Lollipop 转换。我在两个活动(AB)中都有一个共享元素,这是一个简单的 ImageView。我使用共享元素的自定义过渡的工作原理与 native 过渡相同。首先,我将 B activity 的背景设置为透明,然后我捕获共享元素的开始状态并将此数据传递给 B activity。在 B 中,我捕获了共享视图的结束状态并创建了一个 Animator 来为两个状态之间的视图设置动画,当然该动画发生在 B activity 中。

此时,只要我在两个活动中有相同的共享元素,一切就完美了,我可以应用适当的 return 转换。但是,当我想实现某种画廊时(当您可以在 B activity 中向左和向右滑动图像时)我遇到了 return 过渡的问题。在这种情况下,两个活动共享相同的数据源,因此用户可以简单地更改 B activity 中的共享元素。那么,如果我在第二个 activity 中更改共享元素会怎样?然后,显然,为了实现 return 转换,我需要知道 A activity 中该元素的大小和位置,对吧?

基本上,我们只有 2 个场景(如果我错了请纠正我):

此外,我还必须重绘 RecyclerView 或使用 requestLayout()invalidate() 方法保留数据的任何内容。

我知道我可以使用 SharedElementCallback 回调和 onActivityReenter() 方法通过 native 转换实现所有这些东西。这个框架以某种方式处理在被调用的 activity 中而不是在调用者中应用这个 return 转换。

所以,我想知道是否有其他选择?

终于,我找到了问题的答案。正如我稍后所说,我们只有两种情况,所以我实现了第二种。我们可以在这种情况下应用发布-订阅模式,这样就可以从第一个 activity 中检索数据并将请求的数据发送到第二个 activity。只要我在第二个 activity 中有适当的数据,我就可以将图像动画化回它在第一个 activity 中的位置。

为了实现 publish-subscribe 模式,我使用了 Otto,它是一种事件总线,提供了一种机制,您可以使用该机制与应用程序的不同部分进行通信。

你可以找到这个想法的实现here。您还可以在那里找到使用本机转换的示例。