package com.marshalchen.common.demoofui.materialAnimations; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.annotation.TargetApi; import android.os.Build; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.transition.Transition; import android.view.View; import android.view.ViewAnimationUtils; import com.marshalchen.common.demoofui.R; @TargetApi(Build.VERSION_CODES.LOLLIPOP) public class DetailActivity3 extends ActionBarActivity { private static final long ANIM_DURATION = 1000; private View bgViewGroup; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.material_animation_activity_details3); setupLayout(); setupWindowAnimations(); } private void setupLayout() { bgViewGroup = findViewById(R.id.backgroundViewGroup); } private void setupWindowAnimations() { setupEnterAnimations(); setupExitAnimations(); } private void setupEnterAnimations() { Transition enterTransition = getWindow().getSharedElementEnterTransition(); enterTransition.addListener(new Transition.TransitionListener() { @Override public void onTransitionStart(Transition transition) {} @Override public void onTransitionEnd(Transition transition) { animateRevealShow(bgViewGroup); } @Override public void onTransitionCancel(Transition transition) {} @Override public void onTransitionPause(Transition transition) {} @Override public void onTransitionResume(Transition transition) {} }); } private void setupExitAnimations() { Transition sharedElementReturnTransition = getWindow().getSharedElementReturnTransition(); sharedElementReturnTransition.setStartDelay(ANIM_DURATION); Transition returnTransition = getWindow().getReturnTransition(); returnTransition.setDuration(ANIM_DURATION); returnTransition.addListener(new Transition.TransitionListener() { @Override public void onTransitionStart(Transition transition) { animateRevealHide(bgViewGroup); } @Override public void onTransitionEnd(Transition transition) {} @Override public void onTransitionCancel(Transition transition) {} @Override public void onTransitionPause(Transition transition) {} @Override public void onTransitionResume(Transition transition) {} }); } private void animateRevealShow(View viewRoot) { int cx = (viewRoot.getLeft() + viewRoot.getRight()) / 2; int cy = (viewRoot.getTop() + viewRoot.getBottom()) / 2; int finalRadius = Math.max(viewRoot.getWidth(), viewRoot.getHeight()); Animator anim = ViewAnimationUtils.createCircularReveal(viewRoot, cx, cy, 0, finalRadius); viewRoot.setVisibility(View.VISIBLE); anim.setDuration(ANIM_DURATION); anim.start(); } private void animateRevealHide(final View viewRoot) { int cx = (viewRoot.getLeft() + viewRoot.getRight()) / 2; int cy = (viewRoot.getTop() + viewRoot.getBottom()) / 2; int initialRadius = viewRoot.getWidth(); Animator anim = ViewAnimationUtils.createCircularReveal(viewRoot, cx, cy, initialRadius, 0); anim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); viewRoot.setVisibility(View.INVISIBLE); } }); anim.setDuration(ANIM_DURATION); anim.start(); } }