片段之间的共享元素过渡留下神秘的偏移

问题描述

我有一个简单的应用程序,用于显示图像库。单击其中一个后,我希望它过渡到一个详细片段。单击详细片段将弹出片段回栈。过渡效果很好,但是在输入动画时始终在右侧保留偏移,而在退出动画时始终在顶部保留偏移。

初始

Initial

输入

Detail

退出

Exit

转换集

<?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
}
}

解决方法

这似乎是一个由片段到片段过渡的错误。我通过切换到活动“解决了”。