Java tutorial
/* * The MIT License (MIT) * * Copyright (c) 2014 Ozodrukh * Modifications Copyright (C) 2015 Fred Grott(GrottWorkShop) * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * */ package com.grottworkshop.gwscirclereveal.animation; import android.animation.Animator; import android.animation.ObjectAnimator; import android.annotation.TargetApi; import android.os.Build; import android.view.View; import android.view.animation.AccelerateDecelerateInterpolator; import java.lang.ref.WeakReference; import static android.os.Build.VERSION.SDK_INT; import static android.os.Build.VERSION_CODES.LOLLIPOP; import static android.support.v4.view.ViewCompat.animate; import static com.grottworkshop.gwscirclereveal.animation.RevealAnimator.CLIP_RADIUS; /** * ViewAnimationUtils class * Created by fgrott on 8/30/2015. */ @SuppressWarnings("unused") public class ViewAnimationUtils { private final static boolean LOLLIPOP_PLUS = SDK_INT >= LOLLIPOP; public static final int SCALE_UP_DURATION = 500; /** * Returns an Animator which can animate a clipping circle. * <p> * Any shadow cast by the View will respect the circular clip from this animator. * <p> * Only a single non-rectangular clip can be applied on a View at any time. * Views clipped by a circular reveal animation take priority over * {@link android.view.View#setClipToOutline(boolean) View Outline clipping}. * <p> * Note that the animation returned here is a one-shot animation. It cannot * be re-used, and once started it cannot be paused or resumed. * * @param view The View will be clipped to the animating circle. * @param centerX The x coordinate of the center of the animating circle. * @param centerY The y coordinate of the center of the animating circle. * @param startRadius The starting radius of the animating circle. * @param endRadius The ending radius of the animating circle. */ @TargetApi(Build.VERSION_CODES.LOLLIPOP) public static SupportAnimator createCircularReveal(View view, int centerX, int centerY, float startRadius, float endRadius) { if (!(view.getParent() instanceof RevealAnimator)) { throw new IllegalArgumentException("View must be inside RevealFrameLayout or RevealLinearLayout."); } RevealAnimator revealLayout = (RevealAnimator) view.getParent(); revealLayout.attachRevealInfo( new RevealAnimator.RevealInfo(centerX, centerY, startRadius, endRadius, new WeakReference<>(view))); if (LOLLIPOP_PLUS) { return new SupportAnimatorLollipop(android.view.ViewAnimationUtils.createCircularReveal(view, centerX, centerY, startRadius, endRadius), revealLayout); } ObjectAnimator reveal = ObjectAnimator.ofFloat(revealLayout, CLIP_RADIUS, startRadius, endRadius); reveal.addListener(getRevealFinishListener(revealLayout)); return new SupportAnimatorPreL(reveal, revealLayout); } private static Animator.AnimatorListener getRevealFinishListener(RevealAnimator target) { if (SDK_INT >= 18) { return new RevealAnimator.RevealFinishedJellyBeanMr2(target); } else if (SDK_INT >= 14) { return new RevealAnimator.RevealFinishedIceCreamSandwich(target); } else { return new RevealAnimator.RevealFinishedGingerbread(target); } } /** * Lifting view * * @param view The animation target * @param baseRotation initial Rotation X in 3D space * @param fromY initial Y position of view * @param duration aniamtion duration * @param startDelay start delay before animation begin */ @Deprecated public static void liftingFromBottom(View view, float baseRotation, float fromY, int duration, int startDelay) { view.setRotationX(baseRotation); view.setTranslationY(fromY); animate(view).setInterpolator(new AccelerateDecelerateInterpolator()).setDuration(duration) .setStartDelay(startDelay).rotationX(0).translationY(0).start(); } /** * Lifting view * * @param view The animation target * @param baseRotation initial Rotation X in 3D space * @param duration aniamtion duration * @param startDelay start delay before animation begin */ @Deprecated public static void liftingFromBottom(View view, float baseRotation, int duration, int startDelay) { view.setRotationX(baseRotation); view.setTranslationY(view.getHeight() / 3); animate(view).setInterpolator(new AccelerateDecelerateInterpolator()).setDuration(duration) .setStartDelay(startDelay).rotationX(0).translationY(0).start(); } /** * Lifting view * * @param view The animation target * @param baseRotation initial Rotation X in 3D space * @param duration aniamtion duration */ @Deprecated public static void liftingFromBottom(View view, float baseRotation, int duration) { view.setRotationX(baseRotation); view.setTranslationY(view.getHeight() / 3); animate(view).setInterpolator(new AccelerateDecelerateInterpolator()).setDuration(duration).rotationX(0) .translationY(0).start(); } static class SimpleAnimationListener implements Animator.AnimatorListener { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } } }