Android 片段之间的共享元素转换留下神秘的偏移量
我有一个显示图片库的简单应用程序。单击其中一个后,我希望它转换为一个细节片段。单击细节片段将弹出片段backbackback。过渡可以工作,但它在进入动画时始终在右侧保留一个偏移,在退出动画时在顶部保留一个偏移 首字母 输入 退出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
<?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。我通过切换到一项活动来“解决”它