我正在尝试将RecyclerView中所选项目的2个简单视图设置为新片段.我已经查看了很多将共享元素从一个Activity动画到另一个Activity的示例,但很少有动画将共享元素从一个Fragment动画到同一个Activity中的另一个Fragment的示例.它几乎可以工作.
这是我的结构.
活动
- 使用RecyclerView的全屏Fragment1
- 带有详细信息的全屏Fragment2
当用户在Fragment1中的RecyclerView中选择一个项目时,我将Fragment1替换为具有View的Fragment2,其中包含不同位置和大小的共享元素.
要使它工作有一些技巧,你必须确保你的transitionName对于列表中的每个项都是唯一的,当然,transitionName必须与Fragment2中元素的transitionName匹配才能播放动画.我有这个部分工作,当我选择一个项目时,2个共享视图会动画,而不是在2个活动之间进行动画时的预期.
如果我在屏幕底部附近选择一个项目,它会绘制View for Fragment2并为2个共享视图设置动画,就好像它们位于屏幕顶部的项目中一样.难以解释.这是一些照片
片段1

Fragment2

在这两个片段中我都设置了以下内容
setSharedElementEnterTransition(new ChangeBounds());
setSharedElementReturnTransition(new ChangeBounds());
setAllowEnterTransitionOverlap(true);
setAllowReturnTransitionOverlap(true);
Run Code Online (Sandbox Code Playgroud)
同样在他们的onCreate()中的父Activity中我已经设置了
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
Run Code Online (Sandbox Code Playgroud)
知道为什么我的共享元素动画从我的屏幕顶部开始,即使它们是在屏幕底部的选定项目中开始的吗?
android android-fragments shared-element-transition fragment-transitions android-recyclerview
我在项目中使用导航组件。尝试设置来自回收器的共享元素转换。在第二个片段中输入过渡效果很好,但是当我返回到第一个片段时 - 没有返回过渡。
我尝试在第一个片段中显式设置输入和返回转换,就像我在第二个片段中所做的那样
val transition = TransitionInflater.from(context).inflateTransition(android.R.transition.move)
sharedElementEnterTransition = transition
sharedElementReturnTransition = transition
Run Code Online (Sandbox Code Playgroud)
但这没有帮助。
还尝试删除进入和退出片段动画。对于第二个片段,输入过渡适用于动画,但谁知道呢。
还尝试使用此问题的解决方案,但就我而言,它不起作用。 /sf/answers/3704598481/
主片段
stickyAdapter.onItemClick = { event, imageView, textView ->
val args = bundleOf(EventDetailFragment.EVENT to event)
val extras = FragmentNavigatorExtras(
imageView to imageView.transitionName,
textView to textView.transitionName
)
findNavController().navigate(R.id.action_global_eventDetailFragment, args, null, extras)
}
Run Code Online (Sandbox Code Playgroud)
在适配器 onClick 中,我为视图设置了唯一的转换名称: mainFragmentAdapter
eventImageView.setOnClickListener {
titleTextView.transitionName = "${event.title}$TRANSITION_TITLE"
eventImageView.transitionName = "${event.title}$TRANSITION_IMAGE"
onItemClick?.invoke(event, eventImageView, titleTextView)
}
Run Code Online (Sandbox Code Playgroud)
在detailsFragment中,我从参数中获取转换名称(复制粘贴它们以确保没有错误,并且对于输入转换它有效)我在OnCreate方法中调用推迟EnterTransition()等待,直到我可以在onViewCreated中设置转换名称,sharedElementEnterTransition和sharedElementReturnTransition,然后调用startPostponedEnterTransition()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
postponeEnterTransition()
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, …Run Code Online (Sandbox Code Playgroud) android shared-element-transition android-recyclerview android-architecture-navigation