我该怎么做才能将动画重新映射到正确的单元格?所有单元格都有相同的共享 ID。
在第一个活动中,您应该有一些键来指定启动第二个活动的项目。假设您有一个Map
唯一userId
的 s 和User
s,即Map<Integer, User>
。
- 当您启动第二个活动时,请
User
在地图中传递 this 的键,假设它是42
。(在地图42 -> John Doe
中,您正在为 启动第二个活动John Doe
)。
setExitSharedElementCallback()
在第一个活动中并覆盖onMapSharedElements()
。
override fun onMapSharedElements(names: MutableList<String>?,
sharedElements: MutableMap<String, View>?) {
// we will implement this in step 6
}
在第一个活动中覆盖onActivityReenter()
并用 推迟转换supportPostponeEnterTransition()
,以便在我们进行一些操作之前不显示转换(例如,我们想要滚动列表以显示项目)。
- 在
onActivityReenter()
保存Bundle
您通过第二个活动传递的内容Intent
(我们将在第 7 步中看到)。
- 推迟过渡后,
onActivityReenter()
根据您添加到此捆绑包的信息对 UI 进行一些更改。特别是,在我们的例子中,这个包将包括启动第二个活动的原始Integer
密钥。User
您可以通过此键在列表中找到当前位置User
,然后滚动RecyclerView
到该新位置。使该项目可见后,您可以按下触发器并让系统按 开始转换supportStartPostponedEnterTransition()
。
在SharedElementCallback::onMapSharedElements()
检查天气中Bundle
,您在步骤 4 中保存的是否为空。如果它不为空,则意味着您在第二个活动中做了一些事情,并且您希望重新映射共享元素。这意味着您必须执行以下操作:
override fun onMapSharedElements(names: MutableList<String>?,
sharedElements: MutableMap<String, View>?) {
// `reenterBundle` is the `Bundle` you have saved in step 3
if (null != reenterBundle
&& reenterBundle!!.containsKey("KEY_FROM_ACTIVITY_2")
&& null != view) {
val key = reenterBundle!!.getInt("KEY_FROM_ACTIVITY_2");
val newSharedElement = ... // find corresponding view with the `key`
val newTransitionName = ... // transition name of the view
// clear previous mapping and add new one
names?.clear()
names?.add(newTransitionName)
sharedElements?.clear()
sharedElements?.put(newTransitionName, newSharedElement)
reenterBundle = null
} else {
// The activity is exiting
}
}
在第二个活动覆盖finishAfterTransition()
:
override fun finishAfterTransition() {
val data = Intent()
data.putExtra("KEY_FROM_ACTIVITY_2", 42) // `42` is the original position that we passed to this activity via Intent when launching it
setResult(RESULT_OK, data)
super.finishAfterTransition()
}
如果我的用户在列表中不再可见,如何用不同的动画替换返回动画?
您可以使其可见(例如,通过滚动RecyclerView
太多,使您的视图变得可见),或者您可以在第 6 步中通过清除而不向其中添加任何内容来删除共享元素names
转换sharedElements
。
我希望你已经了解了它是如何工作的概念,尽管它看起来有点混乱。但作为对您的帮助,我可以分享我编写的应用程序中的一些代码:
MainActivity - MainPresenter
详细活动