微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从GridViewFragment到ViewPager2Fragment

如何解决从GridViewFragment到ViewPager2Fragment

有两个片段,一个是带有GridView的galleryFragment,另一个是带有ViewPager2的ViewPager2Fragment,单击GridView的项目时,用户将导航到ViewPager2Fragment。

我通过在两个项目之间添加相同的TransitionName(“ gallery_image” + itemPosition)添加了ShareElement。 galleryFragment的项目单击:

FragmentNavigator.Extras extras = new FragmentNavigator.Extras.Builder()
                            .addSharedElement(view,"gallery_image" + position)
                            .build();
Navigation.findNavController(view).navigate(R.id.action_galleryFragment_to_ViewPager2Fragment,null,extras);

galleryFragment的SharedElement:

setExitSharedElementCallback(new SharedElementCallback() {
                @Override
                public void onMapSharedElements(List<String> names,Map<String,View> sharedElements) {
                        View newSharedElement = (View) galleryView.findViewByTag("gallery_image" + activity.getPosition()).getParent();
                        if (newSharedElement != null) {
                            sharedElements.put(names.get(0),newSharedElement);
                        }
                }
});

ViewPager2Fragment:

setSharedElementEnterTransition(TransitionInflater.from(getContext()).inflateTransition(android.R.transition.move));
postponeEnterTransition();
setEnterSharedElementCallback(new SharedElementCallback() {
                @Override
                public void onMapSharedElements(List<String> names,View> sharedElements) {
                        View currentItemView = viewPager.findViewWithTag("gallery_image" + activity.getPosition());
                        if (currentItemView != null) {
                            sharedElements.put(names.get(0),currentItemView);
                        }
                }
});

...

pageAdapter.setonLoadedListener(new pageAdapter.OnLoadListener() {
                @Override
                public void onComplete(int position) {
                    startPostponedEnterTransition();
                }
            });
            viewPager.setAdapter(pageAdapter);
            viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
                @Override
                public void onPageSelected(int position) {
                    super.onPageSelected(position);
                    activity.setPosition(position);
                }
            });
            viewPager.setCurrentItem(activity.getPosition(),false);

galleryFragment到ViewPager2Fragment,回到galleryFragment,而无需更改ViewPager的页面,一切都进行得很好。但是,随着ViewPager的页面更改返回到galleryFragment时,startShareElement消失了,导航是:

  • gridItem1-> viewPageItem1
  • viewPageItem1-> viewPageItem0
  • 返回galleryFragment
  • 将outShareElement更改为gridItem0
  • gridItem1消失

请参见video

而且,当outShareElement已更改为gridItem0时,如何显示gridItem1?

解决方法

我解决了。这是ChangeTransform的窍门,ChangeTransform将检查inShareElement和outShareElement的parentView转换,然后创建适当的动画。因此,我将两个itemView的parentView调整为正确的大小和位置。

记住: 必须使用setSharedElementEnterTransition()将GalleryFragment和ViewPager2Fragment设置为相同的mSharedElementEnterTransition; 否则,将会发生奇怪的动画。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。