Android GridLayout共享元素转换无法正常工作
我正在尝试在带有Android GridLayout共享元素转换无法正常工作,android,android-fragments,android-recyclerview,kotlin,android-transitions,Android,Android Fragments,Android Recyclerview,Kotlin,Android Transitions,我正在尝试在带有GridLayoutManager的RecyclerView和片段之间创建一个转换。网格显示用户图片缩略图,当我点击缩略图时,它显示用户的详细信息。但是,当我点击缩略图并显示详细信息时,转换总是从屏幕的左上角开始,而不是从缩略图位置开始 如何从缩略图位置开始过渡 这就是我想要的结果: 这就是我得到的: 这是我的代码: // UsersAdapter.kt override fun onBindViewHolder(holder: UserViewHolder, positio
GridLayoutManager的RecyclerView
和片段之间创建一个转换。网格显示用户图片缩略图,当我点击缩略图时,它显示用户的详细信息。但是,当我点击缩略图并显示详细信息时,转换总是从屏幕的左上角开始,而不是从缩略图位置开始
如何从缩略图位置开始过渡
这就是我想要的结果:
这就是我得到的:
这是我的代码:
// UsersAdapter.kt
override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
ViewCompat.setTransitionName(holder.itemView.picture, "picture_$position")
}
从您共享的代码来看,假设您已经共享了所有添加的与共享元素转换相关的代码,我相信您将错过推迟和恢复共享元素转换调用
我们想要转换的图像被加载到网格和寻呼机中,并且需要时间来加载。为了使其正常工作,我们需要推迟转换,直到参与视图准备就绪(例如,布局并加载图像数据)
为此,我们在片段的onCreateView()中调用一个延迟EnterTransition(),一旦加载了映像,我们就通过调用startPostponedEnterTransition()来启动转换
注意:在导航应用程序时,网格和寻呼机片段都需要延迟,以支持向前和向后转换
更多资源用于更深入的解释:
请复制并粘贴此问题已解决部分的内容。另外,我使用Kotlin的合成视图作为共享元素,这导致了问题。
// 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)
// DetailsFragment.kt
class DetailsFragment : Fragment() {
companion object {
fun create(user: User, transitionName: String): DetailsFragment {
val args = Bundle()
args.putParcelable("user", user)
args.putString("transition_name", transitionName)
val fragment = DetailsFragment()
fragment.arguments = args
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
fragment.sharedElementEnterTransition = ChangeBounds()
fragment.sharedElementReturnTransition = ChangeBounds()
}
return fragment
}
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_details, container, false).apply {
val transitionName = arguments?.getString("transition_name", "")
ViewCompat.setTransitionName(findViewById(R.id.picture), transitionName)
}
}
}