当一个活动的回收者视图项转换为另一个活动,例如此处https://storage.googleapis.com/spec-host-backup/mio-design%2Fassets%2F15N3n1xwTt0briEbfIvFUG01pMv2d_xaT%2F02-focus-focalelement-do.mp4时,我想在我的应用程序中实现共享元素转换。 (来源:https://material.io/design/motion/choreography.html#using-a-focal-element)
即,该项目逐渐消失并改变边界,然后新活动逐渐消失。据我所知,它是简单的自动转换,但无效。简单的衰落也不起作用。
因此,到目前为止,我仅实现该项目获得新活动的背景,然后更改其范围。
答案 0 :(得分:0)
因此,我最终在结果活动布局中添加了回收者视图项目的布局。单击的项目的数据(例如标题等)将通过intent.putExtra()
传输到下一个活动。在这种情况下,共享元素当然将是项目的根视图和结果活动的根视图。当活动开始时,我通过SharedElementCallback将项目的数据设置为与活动中的匹配视图相对应,例如:
setEnterSharedElementCallback(
object : SharedElementCallback() {
override fun onSharedElementStart(...) {
val title = intent.getStringExtra(TITLE)
activity_item_title.text = title
........
}
override fun onSharedElementEnd(...) {
}
})
这允许在过渡开始时显示完全相同的项目视图。然后,它应该开始更改其边界,同时淡出该项目的视图。在某些情况下(例如,在过渡过程中),当初始视图完全消失时,活动的场景就会出现,并逐渐消失。为此,我们需要在过渡的中间(View.visibility = View.GONE
)隐藏项目的视图,并使活动视图可见。也许这不是最好的方法,但是我可以通过在共享元素中添加一个侦听器来输入过渡并使用Handler().postDelayed
:
window.sharedElementEnterTransition.addListener(
object : android.transition.Transition.TransitionListener {
override fun onTransitionEnd(transition: Transition) {}
override fun onTransitionResume(transition: Transition) {}
override fun onTransitionPause(transition: Transition) {}
override fun onTransitionCancel(transition: Transition) {}
override fun onTransitionStart(transition: Transition) {
Handler().postDelayed({
activity_item.visibility = View.GONE
activity_view_1.visibility = View.VISIBLE
activity_view_2.visibility = View.VISIBLE
.............
.............
// Also you could e.g. set the background to your activity here, ets.
activity_view_root.background = backgroundDrawable
}, 150) //suppuse that the whole transition length is 300ms
}
}
})
过渡动画本身可能如下所示:
<transitionSet>
<targets>
<target android:targetId="@id/activity_root_view"/>
</targets>
<transition
class="com.organization.app.utils.FadeOutTransition"
android:duration="150"/>
<transition
class="com.organization.app.utils.FadeInTransition"
android:startDelay="150"/>
<changeBounds android:duration="300"/>
</transitionSet>
在这里,使用了自定义的FadeOutTransition和FadeInTransition,因为简单的Android <fade/>
动画不适用于共享元素。这些类与此处答案中给出的类类似:Why Fade transition doesn't work on Shared Element。
创建返回过渡的步骤相似。