Android 片段之间的共享元素转换留下神秘的偏移量

Android 片段之间的共享元素转换留下神秘的偏移量,android,transition,android-transitions,shared-element-transition,Android,Transition,Android Transitions,Shared Element Transition,我有一个显示图片库的简单应用程序。单击其中一个后,我希望它转换为一个细节片段。单击细节片段将弹出片段backbackback。过渡可以工作,但它在进入动画时始终在右侧保留一个偏移,在退出动画时在顶部保留一个偏移 首字母 输入 退出 <?xml version="1.0" encoding="utf-8"?> <transitionSet xmlns:android="http://schemas.android.com/ap

我有一个显示图片库的简单应用程序。单击其中一个后,我希望它转换为一个细节片段。单击细节片段将弹出片段backbackback。过渡可以工作,但它在进入动画时始终在右侧保留一个偏移,在退出动画时在顶部保留一个偏移

首字母

输入

退出

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

转换集

<?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>
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
}
}
细节片段

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

这似乎是一个带有片段到片段转换的bug。我通过切换到一项活动来“解决”它