How to start shared element transition using Fragments?

前端 未结 8 1405
心在旅途
心在旅途 2020-12-04 06:32

I am trying to implement transitions between fragments which have \"shared elements\" as described in the new material design specs. The only method I can find is the Activi

8条回答
  •  旧时难觅i
    2020-12-04 07:24

    I had the same problem but had it working by adding a new fragment from another fragment. The following link is very helpful in getting started on this: https://developer.android.com/training/material/animations.html#Transitions

    Following is my code that works. I'm animating an ImageView from one fragment to the other. Make sure the View you want to animate has the same android:transitionName in both fragments. The other content doesn't really matter.

    As a test, you could copy this to both your layout xml files. Make sure the image exists.

    
    

    Then I have 1 file in my res/transition folder, named change_image_transform.xml.

    
    
        
    
    

    Now you can get started. Lets say you have Fragment A containing the image and want to add Fragment B.

    Run this in Fragment A:

    @Override
    public void onClick(View v) {
        switch(v.getId()) {
            case R.id.product_detail_image_click_area:
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    setSharedElementReturnTransition(TransitionInflater.from(getActivity()).inflateTransition(R.transition.change_image_transform));
                    setExitTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.explode));
    
                    // Create new fragment to add (Fragment B)
                    Fragment fragment = new ImageFragment();
                    fragment.setSharedElementEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(R.transition.change_image_transform));
                    fragment.setEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.explode));
    
                    // Our shared element (in Fragment A)
                    mProductImage   = (ImageView) mLayout.findViewById(R.id.product_detail_image);
    
                    // Add Fragment B
                    FragmentTransaction ft = getFragmentManager().beginTransaction()
                            .replace(R.id.container, fragment)
                            .addToBackStack("transaction")
                            .addSharedElement(mProductImage, "MyTransition");
                    ft.commit();
                }
                else {
                    // Code to run on older devices
                }
                break;
        }
    }
    

提交回复
热议问题