如何使用焦点元素实现共享元素过渡

时间:2018-11-20 14:17:05

标签: android shared-element-transition

当一个活动的回收者视图项转换为另一个活动,例如此处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

即,该项目逐渐消失并改变边界,然后新活动逐渐消失。据我所知,它是简单的自动转换,但无效。简单的衰落也不起作用。

因此,到目前为止,我仅实现该项目获得新活动的背景,然后更改其范围。

1 个答案:

答案 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

创建返回过渡的步骤相似。