我正在使用Fragment Navigation Pattern(一个包含许多片段的活动)的Android应用上工作。我已按照this guide设法实施了共享项目转换,但只能继续工作,而不是回击。
My Fragment(称为UserFragment
)由一个ViewPager
和另外3个使用RecyclerViews的片段组成。单击RecyclerViews中的任何项目将打开具有相同视图的另一个UserFragment
。切换到新片段时,过渡效果非常好,但我关闭它时无法使其工作。回击时,片段会淡出,前一个片段会淡入。
transitionName
是个人资料 SharedItemTransition
是一个扩展TransitionSet
这是 RecyclerView适配器的onBindViewHolder
方法:
public void onBindViewHolder(final UserViewHolder uvh, int position) {
final LocUser user = users.get(position);
String transition = "user_" + user.id() + "_type_" + type + "_item_" + position + "_profile_image";
uvh.name.setText(user.name());
uvh.username.setText(user.handle());
Global.setImage(uvh.userImage, user.profileImage());
ViewCompat.setTransitionName(uvh.userImage, transitionName(position));
uvh.root.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
activity.openUserProfile(user, uvh.userImage);
}
});
}
这是我的活动方法,它调用FragmentManager
并启动动画:
public void openUserProfile(LocUser user, ImageView view) {
UserProfileFragment uf = UserProfileFragment.create(user);
uf.setExitTransition(new Fade());
uf.setEnterTransition(new Fade());
uf.setSharedElementEnterTransition(new SharedItemTransition());
uf.setSharedElementReturnTransition(new SharedItemTransition());
getSupportFragmentManager()
.beginTransaction()
.addSharedElement(view, "profile")
.replace(R.id.container, uf)
.addToBackStack(null)
.commit();
}
这就是它的样子:
答案 0 :(得分:0)
我找到了解决此问题的方法,以下是所有魔术:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
postponeEnterTransition()
vm.state.observe(viewLifecycleOwner, Observer {
if (it == QuizListViewModel.State.Ready) {
(view.parent as? ViewGroup)?.doOnPreDraw {
startPostponedEnterTransition()
}
}
})
}
如果您的视图包含RecyclerView,则必须推迟动画直到列表被填充并渲染视图。这篇非常有用的文章❤️Fragment Transitions by Chris Banes