GridLayout共享元素过渡无法正常工作

时间:2018-09-05 00:25:20

标签: android android-fragments android-recyclerview kotlin android-transitions

我正在尝试在带有RecyclerView的{​​{1}}和片段之间创建过渡。网格显示用户图片缩略图,当我点击缩略图时,它显示用户的详细信息。但是,当我点击缩略图并显示详细信息时,过渡总是从屏幕的左上角开始,而不是从缩略图位置开始。

如何使过渡从缩略图位置开始?

这是我想要的结果:

Expected result

这就是我得到的:

Transition result

这是我的代码:

GridLayoutManager

// UsersAdapter.kt
override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
        ViewCompat.setTransitionName(holder.itemView.picture, "picture_$position")
}

// MasterFragment.kt
// This is called when i click an item in the grid
itemClickSubject.subscribe { position ->
        val user = users[position]
        val transitionName = "picture_$position"

        fragmentManager
                ?.beginTransaction()
                ?.addSharedElement(picture, transitionName)
                ?.replace(R.id.content, DetailsFragment.create(user, transitionName))
                ?.addToBackStack(null)
                ?.commit()
    }.addTo(disposables)

1 个答案:

答案 0 :(得分:1)

从您共享的代码中,假设您已经共享了所有添加的与共享元素转换有关的代码,我相信您会错过推迟并恢复共享元素转换的调用。

  

我们要转换的图像被加载到网格和寻呼机中,并需要一些时间来加载。为了使其正常工作,我们需要推迟过渡,直到参与的视图准备就绪(例如,布局并加载图像数据)为止。

     

为此,我们在片段的onCreateView()中调用postponeEnterTransition(),并在加载图像后,通过调用startPostponedEnterTransition()开始过渡。

     

请注意:在浏览应用程序时,网格和分页器片段都会调用postpone以支持向前和向后转换。

https://android-developers.googleblog.com/2018/02/continuous-shared-element-transitions.html

更多资源进行更深入的说明:

https://www.androiddesignpatterns.com/2015/03/activity-postponed-shared-element-transitions-part3b.html