需要有关共享元素片段转换的帮助

时间:2015-03-18 12:41:39

标签: android android-5.0-lollipop shared-element-transition fragment-transitions

我需要有关Fragment片段转换的帮助。我不清楚如何正确地做到这一点,因为我找不到很少的文件。

我有一个带有电影海报的GridView。当单击一张海报时,它将移动到下一个片段。海报是共享元素,它将调整大小(变大)并覆盖屏幕。其他元素将根据内容过渡。这是正常的。

无法获得重新进入转换。按下后退按钮时,网格视图中的第一个元素将始终存在(它不跟随内容转换(淡入淡出)),然后其他元素淡入。共享元素不会调整大小(变小)并加入其他元素。它与其他元素一起淡入,因此遵循内容过渡样式。 这是我的代码:

NowShowingFragment.java包含带图像的gridview

 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
    setHasOptionsMenu(true);
    Transition shared = TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.fade);
    shared.setDuration(2000);
    setExitTransition(shared);
}  

在我的OnCreateView中 - 我正在使用Picasso从web加载图像。所以我首先从Imageview中提取位图并将其传递给Activity,然后将其传递给下一个要显示的片段。(不知道这是否是应该如何做。)

 mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            imageView = (ImageView) view.findViewById(R.id.gridImage);
            Drawable drawable = imageView.getDrawable();

            if (drawable instanceof BitmapDrawable) {
                bmp = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
            } else {
                return;
            }
            imageView.setTransitionName("Poster" + position);
            mCallback.onArticleSelected(bmp, "Poster" + position, imageView);
        }
    });  

MainActivity

 @Override
public void onArticleSelected(Bitmap bmp, String name, ImageView image) {

    NowShowingDetail newFragment = new NowShowingDetail();

    Transition shared=TransitionInflater.from(this).inflateTransition(android.R.transition.move);
    shared.setDuration(2000);
    Bundle args = new Bundle();
    args.putParcelable("Bitmap", bmp);
    args.putString("TransitionName", name);
    newFragment.setArguments(args);
    newFragment.setEnterTransition(shared);
    newFragment.setSharedElementEnterTransition(TransitionInflater.from(this).inflateTransition(R.transition.change_image_transform));

    getSupportFragmentManager().beginTransaction().replace(R.id.now_showing_fragment, newFragment).addToBackStack(null).addSharedElement(image, image.getTransitionName()).commit();

}  

在NowShowingDetail中 - 这是将替换旧片段的新片段。它将全屏显示共享元素。

 @Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.testlayout, container, false);
    ImageView imageView = (ImageView) rootView.findViewById(R.id.gridImage);

    Bundle arguments = getArguments();
    if (arguments != null) {
        Bitmap bitmap = arguments.getParcelable("Bitmap");
        imageView.setImageBitmap(bitmap);
        imageView.setTransitionName(arguments.getString("TransitionName"));

    }
    return rootView;
}  

change_image_transorm.xml

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeImageTransform
    android:duration="2000"></changeImageTransform>
<changeBounds
    android:duration="2000"></changeBounds>
<changeTransform
    android:duration="2000"></changeTransform>


提前谢谢。

编辑:使用相同的代码我改为活动转换方法。这完美无瑕。我认为他们称之为片段转换可能是错误的。你的观点赞赏。

1 个答案:

答案 0 :(得分:0)

我注意到没有共享元素退出并重新进入碎片的转换。

引自@George Mount帖子:

除了没有共享元素退出和共享元素返回转换之外,所有这些转换在片段转换中都是相同的。 Fragment Transitions使用FragmentTransaction工作。您删除片段,然后添加片段,并激活过渡。如果你删除一个片段,肯定很难对它进行一些操作,就像你在Activity Transition中那样。相反,在开始FragmentTransaction之前,你将不得不进行操作。

来自https://halfthought.wordpress.com/2014/12/08/what-are-all-these-dang-transitions/

所以我认为片段转换只是一种方式。如果是这种情况,那么行为就像预期一样。

保持这一点被接受,直到其他人给出更好的解释。