我有一个简单的应用程序,用于显示图像库。单击其中一个后,我希望它过渡到一个详细片段。单击详细片段将弹出片段回栈。过渡效果很好,但是在输入动画时始终在右侧保留偏移,而在退出动画时始终在顶部保留偏移。
初始
输入
退出
转换集
<?xml version="1.0" encoding="utf-8"?>
<transitionSet
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="100"
>
<changeBounds/>
<changeClipBounds/>
<changeTransform/>
<changeImageTransform/>
</transitionSet>
RecyclerView项目XML
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ProgressBar
android:id="@+id/progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone"
/>
<ImageView
android:id="@+id/image_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
/>
</FrameLayout>
详细XML
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/image_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
/>
</FrameLayout>
打开详细片段逻辑
override fun openImageFragment(imageView: ImageView) {
val fragment = ImageFragment.newInstance(imageView.transitionName)
fragment.drawable = imageView.drawable
supportFragmentManager
.beginTransaction()
.setReorderingAllowed(true)
.addToBackStack(null)
.addSharedElement(imageView, imageView.transitionName)
.replace(R.id.container_fragment, fragment)
.commit()
}
详细信息片段
class ImageFragment : Fragment() {
private lateinit var binding: FragmentImageBinding
var drawable: Drawable? = null
companion object {
const val KEY_IMAGE = "IMAGE"
fun newInstance(transitionName: String): ImageFragment {
val bundle = Bundle().also {
it.putString(KEY_IMAGE, transitionName)
}
val fragment = ImageFragment()
fragment.arguments = bundle
return fragment
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
postponeEnterTransition()
val transition = TransitionInflater.from(requireContext()).inflateTransition(R.transition.scale_image)
transition.addListener(object : TransitionListenerAdapter() {
override fun onTransitionEnd(transition: Transition) {
binding.root.setOnClickListener {
requireActivity().supportFragmentManager.popBackStack()
}
}
})
sharedElementEnterTransition = transition
sharedElementReturnTransition = transition
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentImageBinding.inflate(inflater, container, false)
binding.imageView.transitionName = arguments?.getString(KEY_IMAGE)
binding.imageView.setImageDrawable(drawable)
binding.imageView.doOnPreDraw { startPostponedEnterTransition() }
return binding.root
}
}
答案 0 :(得分:0)
这似乎是一个由片段到片段过渡的错误。我通过切换到活动“解决了”。