共享项目转换不在片段背面工作

She*_*yar 8 android transitions android-fragments

我正在开发一个带有片段导航模式的Android应用程序(一个活动包含许多碎片).我已经设法按照本指南实施共享项目转换,但它们只能继续工作,而不是回击.

My Fragment(被称为UserFragment)由一个ViewPager带有RecyclerViews的3个片段组成.单击RecyclerViews中的任何项目将打开另一个UserFragment具有相同视图的项目.切换到新片段时,过渡效果非常好,但是在关闭它时我无法使其工作.回击时,片段会淡出,前一个片段会淡入.

TL; DR:

  • 有问题的共享元素是顶部的圆形图像视图
  • transitionName个人资料
  • SharedItemTransition 是一个扩展的自定义类 TransitionSet
  • 我已经在每个recyclerview中给出了每个项目唯一的转换名称,包括他们的用户ID,列表类型和位置索引(如果它们不是唯一的,它也将无法继续)

onBindViewHolder是我的RecyclerView适配器的方法:

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);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

这是我调用和启动动画的activity方法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();
}
Run Code Online (Sandbox Code Playgroud)

这就是它的样子:

截图

Mar*_*cki 0

我已经找到了这个问题的解决方案,所有的魔法如下:

\n\n
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n    super.onViewCreated(view, savedInstanceState)\n    postponeEnterTransition()\n    vm.state.observe(viewLifecycleOwner, Observer  {\n        if (it == QuizListViewModel.State.Ready) {\n            (view.parent as? ViewGroup)?.doOnPreDraw {\n                startPostponedEnterTransition()\n            }\n        }\n    })\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您的视图包含 RecyclerView,则必须推迟动画,直到列表填满并渲染视图。有关更多信息,请参阅 Chris Banes 撰写的这篇非常有用的文章 \xe2\x9d\xa4\xef\xb8\x8f Fragment Transitions

\n