Circular reveal transition for new activity

后端 未结 5 784
耶瑟儿~
耶瑟儿~ 2020-11-28 02:08

As per https://developer.android.com/training/material/animations.html

The ViewAnimationUtils.createCircularReveal() method enables you t

5条回答
  •  攒了一身酷
    2020-11-28 02:47

    After looking for a solution for half a day without a result, I came up with an own implementation. I'm using a transparent activity with a matching root layout. The root layout is a view which can then be revealed with createCircularReveal().

    My code looks like this:

    Theme Definition in styles.xml

    
    

    Activity Definition in AndroidManifest.xml

    
    

    then I declared a layout for my activity (I've chosen DrawerLayout, so that I can have a NavDrawer. Every layout should work here.)

    
    
        
    
            
    
        
    
    
    

    Important is the FrameLayout with the id root_layout. This view will be revealed in the activity.

    Finally I implemented CircularRevealActivity and overwrote onCreate():

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        overridePendingTransition(R.anim.do_not_move, R.anim.do_not_move);
    
        setContentView(R.layout.activity_reveal_circular);
    
        if (savedInstanceState == null) {
            rootLayout.setVisibility(View.INVISIBLE);
    
            ViewTreeObserver viewTreeObserver = rootLayout.getViewTreeObserver();
            if (viewTreeObserver.isAlive()) {
                viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                    @Override
                    public void onGlobalLayout() {
                        circularRevealActivity();
                        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                            rootLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                        } else {
                            rootLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                        } 
                    }
                });
            }
        }
    }
    

    It was important to put circularRevealActivity() into a OnGlobalLayoutListener, because the view needs to be drawn for the animation.

    circularRevealActivity() looks like Ishaan's proposal:

    private void circularRevealActivity() {
    
        int cx = rootLayout.getWidth() / 2;
        int cy = rootLayout.getHeight() / 2;
    
        float finalRadius = Math.max(rootLayout.getWidth(), rootLayout.getHeight());
    
        // create the animator for this view (the start radius is zero)
        Animator circularReveal = ViewAnimationUtils.createCircularReveal(rootLayout, cx, cy, 0, finalRadius);
        circularReveal.setDuration(1000);
    
        // make the view visible and start the animation
        rootLayout.setVisibility(View.VISIBLE);
        circularReveal.start();
    }
    

    Edit 1

    The definition for R.anim.do_not_move was added. However, it should work without that line too, if your design does not specify default transitions for activities. Let me know

    R.anim.do_not_move:

    
    
    
    

提交回复
热议问题