diff --git a/app/build.gradle b/app/build.gradle index 6033035..652eb71 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 22 - buildToolsVersion "22.0.1" + compileSdkVersion 23 + buildToolsVersion "23.0.2" defaultConfig { applicationId "io.codetail.circualrevealsample" - minSdkVersion 9 - targetSdkVersion 22 + minSdkVersion 15 + targetSdkVersion 23 versionCode 1 versionName "1.0" } @@ -21,10 +21,10 @@ dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile project(':circualreveal') - compile 'com.android.support:appcompat-v7:22.2.0' - compile 'com.android.support:recyclerview-v7:22.2.0' - compile 'com.android.support:cardview-v7:22.2.0' - compile 'com.android.support:design:22.2.0' + compile 'com.android.support:appcompat-v7:23.1.1' + compile 'com.android.support:recyclerview-v7:23.1.1' + compile 'com.android.support:cardview-v7:23.1.1' + compile 'com.android.support:design:23.1.1' compile 'com.jakewharton:butterknife:6.0.0' } diff --git a/app/src/main/java/io/codetail/circualrevealsample/FragmentRevealExample.java b/app/src/main/java/io/codetail/circualrevealsample/FragmentRevealExample.java new file mode 100644 index 0000000..34ae308 --- /dev/null +++ b/app/src/main/java/io/codetail/circualrevealsample/FragmentRevealExample.java @@ -0,0 +1,69 @@ +package io.codetail.circualrevealsample; + +import android.animation.Animator; +import android.graphics.Color; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.view.animation.AccelerateDecelerateInterpolator; +import android.widget.FrameLayout; +import android.widget.ImageView; + +import io.codetail.animation.ViewAnimationUtils; +import io.codetail.widget.RevealFrameLayout; + +import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; +import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; + +public class FragmentRevealExample extends Fragment { + + private Animator mRevealAnimator; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + final FrameLayout frameLayout = new RevealFrameLayout(getContext()); + + final FrameLayout content = new FrameLayout(getContext()); + content.setBackgroundColor(Color.WHITE); + content.setVisibility(View.INVISIBLE); + + frameLayout.addView(content, new FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT)); + + final ImageView imageView = new ImageView(getContext()); + imageView.setImageResource(R.drawable.example_raw_image); + + FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT); + lp.topMargin = 16; + lp.leftMargin = 16; + lp.rightMargin = 16; + lp.bottomMargin = 16; + + content.addView(imageView, lp); + + content.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + content.getViewTreeObserver().removeOnPreDrawListener(this); + content.setVisibility(View.VISIBLE); + + // actually you need to set visibility before stating animation in listener + + mRevealAnimator = ViewAnimationUtils.createCircularReveal(content, 0, 0, 0, + MainActivity.hypo(content.getWidth(), content.getHeight())); + mRevealAnimator.setDuration(500); + mRevealAnimator.setStartDelay(100); + mRevealAnimator.setInterpolator(new AccelerateDecelerateInterpolator()); + mRevealAnimator.start(); + return true; + } + }); + + return frameLayout; + } + +} diff --git a/app/src/main/java/io/codetail/circualrevealsample/MainActivity.java b/app/src/main/java/io/codetail/circualrevealsample/MainActivity.java index f8f9997..e02431b 100644 --- a/app/src/main/java/io/codetail/circualrevealsample/MainActivity.java +++ b/app/src/main/java/io/codetail/circualrevealsample/MainActivity.java @@ -1,5 +1,6 @@ package io.codetail.circualrevealsample; +import android.animation.ObjectAnimator; import android.content.Intent; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; @@ -21,9 +22,6 @@ import android.view.animation.Interpolator; import android.widget.Toast; -import com.nineoldandroids.animation.ObjectAnimator; -import com.nineoldandroids.view.ViewHelper; - import java.lang.ref.WeakReference; import butterknife.ButterKnife; @@ -62,6 +60,7 @@ protected void onCreate(Bundle savedInstanceState) { mCardsAdapter = new RecycleAdapter(); mCardsAdapter.setHasStableIds(true); + mCardsGroup.addOnScrollListener(new HideExtraOnScroll(mToolbar)); mCardsGroup.setHasFixedSize(true); mCardsGroup.setItemViewCacheSize(3); mCardsGroup.setClipToPadding(false); @@ -158,20 +157,6 @@ static float hypo(int a, int b){ return (float) Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2)); } - @Override - protected void onStart() { - super.onStart(); - mCardsGroup.setOnScrollListener(new HideExtraOnScroll(mToolbar)); - } - - @Override - protected void onStop() { - super.onStop(); - - // Prevent memory leaks, fuck yeah! - mCardsGroup.setOnScrollListener(null); - } - public static class RecycleAdapter extends RecyclerView.Adapter{ @Override @@ -302,14 +287,14 @@ public boolean isVisible(View target){ public void hide(final View target, float distance){ ObjectAnimator animator = ObjectAnimator.ofFloat(target, "translationY", - ViewHelper.getTranslationY(target), distance); + target.getTranslationY(), distance); animator.setInterpolator(DECELERATE); animator.start(); } public void show(final View target){ ObjectAnimator animator = ObjectAnimator.ofFloat(target, "translationY", - ViewHelper.getTranslationY(target), 0f); + target.getTranslationY(), 0f); animator.setInterpolator(ACCELERATE); animator.start(); } @@ -327,13 +312,23 @@ public boolean onOptionsItemSelected(MenuItem item) { Intent intent = null; switch (item.getItemId()){ - case R.id.sampl2: + case R.id.sample2: intent = new Intent(this, Sample2Activity.class); break; - case R.id.sampl3: + case R.id.sample3: intent = new Intent(this, Sample3Activity.class); break; + + case R.id.sample4: + + getSupportFragmentManager() + .beginTransaction() + .add(android.R.id.content, new FragmentRevealExample(), "fragment:reveal") + .addToBackStack("fragment:reveal") + .commit(); + + return true; } startActivity(intent); diff --git a/app/src/main/java/io/codetail/circualrevealsample/Sample3Activity.java b/app/src/main/java/io/codetail/circualrevealsample/Sample3Activity.java index 607a040..e87bb9b 100644 --- a/app/src/main/java/io/codetail/circualrevealsample/Sample3Activity.java +++ b/app/src/main/java/io/codetail/circualrevealsample/Sample3Activity.java @@ -1,18 +1,17 @@ package io.codetail.circualrevealsample; -import android.graphics.Rect; -import android.os.Build; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.ViewTreeObserver; +import android.view.ViewTreeObserver.OnPreDrawListener; import android.view.animation.AccelerateDecelerateInterpolator; import io.codetail.animation.SupportAnimator; import io.codetail.animation.ViewAnimationUtils; public class Sample3Activity extends AppCompatActivity - implements ViewTreeObserver.OnGlobalLayoutListener{ + implements OnPreDrawListener{ private CardViewPlus mContentView; @@ -23,7 +22,7 @@ protected void onCreate(Bundle savedInstanceState) { mContentView = (CardViewPlus) findViewById(R.id.content); - getViewTreeObserver().addOnGlobalLayoutListener(this); + getViewTreeObserver().addOnPreDrawListener(this); } protected View getRootView(){ @@ -35,23 +34,19 @@ protected ViewTreeObserver getViewTreeObserver(){ } protected void startRevealTransition(){ - final Rect bounds = new Rect(); - getRootView().getHitRect(bounds); SupportAnimator animator = ViewAnimationUtils.createCircularReveal(getRootView(), - bounds.right, bounds.bottom, 0, Sample2Activity.hypo(bounds.height(), bounds.width())); + getRootView().getRight(), getRootView().getBottom(), 0, + Sample2Activity.hypo(getRootView().getHeight(), getRootView().getWidth()), + View.LAYER_TYPE_SOFTWARE); animator.setDuration(1000); animator.setInterpolator(new AccelerateDecelerateInterpolator()); animator.start(); } @Override - public void onGlobalLayout() { - if(Build.VERSION.SDK_INT >= 16) { - getViewTreeObserver().removeOnGlobalLayoutListener(this); - }else{ - getViewTreeObserver().removeGlobalOnLayoutListener(this); - } - + public boolean onPreDraw() { + getViewTreeObserver().removeOnPreDrawListener(this); startRevealTransition(); + return true; } } diff --git a/app/src/main/res/drawable-nodpi/example_raw_image.jpg b/app/src/main/res/drawable-nodpi/example_raw_image.jpg new file mode 100644 index 0000000..44fdb70 Binary files /dev/null and b/app/src/main/res/drawable-nodpi/example_raw_image.jpg differ diff --git a/app/src/main/res/drawable/image_borders.xml b/app/src/main/res/drawable/image_borders.xml new file mode 100644 index 0000000..19c88ed --- /dev/null +++ b/app/src/main/res/drawable/image_borders.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index 1d134e1..ac8f597 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -2,13 +2,18 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> - - + + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index c7c9458..5f9dca4 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -46,7 +46,7 @@ - + diff --git a/build.gradle b/build.gradle index a212805..b20c3ef 100644 --- a/build.gradle +++ b/build.gradle @@ -5,8 +5,8 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.2.3' - classpath 'com.github.dcendents:android-maven-plugin:1.2' + classpath 'com.android.tools.build:gradle:1.5.0' + classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } diff --git a/circualreveal/build.gradle b/circualreveal/build.gradle index 8c74875..a759b55 100644 --- a/circualreveal/build.gradle +++ b/circualreveal/build.gradle @@ -1,17 +1,37 @@ apply plugin: 'com.android.library' -apply plugin: 'android-maven' +apply plugin: 'com.github.dcendents.android-maven' android { - compileSdkVersion 22 - buildToolsVersion "22.0.1" + compileSdkVersion 23 + buildToolsVersion "23.0.2" defaultConfig { - minSdkVersion 9 - targetSdkVersion 22 + minSdkVersion 15 + targetSdkVersion 23 } } -dependencies { - compile 'com.nineoldandroids:library:2.4.0' +// build a jar with source files +task sourcesJar(type: Jar) { + from android.sourceSets.main.java.srcDirs + classifier = 'sources' +} + +task javadoc(type: Javadoc) { + failOnError false + source = android.sourceSets.main.java.sourceFiles + classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) + classpath += configurations.compile +} + +// build a jar with javadoc +task javadocJar(type: Jar, dependsOn: javadoc) { + classifier = 'javadoc' + from javadoc.destinationDir +} + +artifacts { + archives sourcesJar + archives javadocJar } diff --git a/circualreveal/src/main/java/io/codetail/animation/RevealAnimator.java b/circualreveal/src/main/java/io/codetail/animation/RevealAnimator.java index 61844be..4624337 100644 --- a/circualreveal/src/main/java/io/codetail/animation/RevealAnimator.java +++ b/circualreveal/src/main/java/io/codetail/animation/RevealAnimator.java @@ -1,17 +1,13 @@ package io.codetail.animation; -import android.annotation.TargetApi; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; import android.graphics.Rect; -import android.os.Build; +import android.util.Property; import android.view.View; -import com.nineoldandroids.animation.Animator; -import com.nineoldandroids.util.FloatProperty; - import java.lang.ref.WeakReference; -import static io.codetail.animation.ViewAnimationUtils.SimpleAnimationListener; - /** * @hide */ @@ -99,81 +95,47 @@ public boolean hasTarget(){ } } - class RevealFinishedGingerbread extends SimpleAnimationListener { + class RevealFinishedIceCreamSandwich extends AnimatorListenerAdapter { WeakReference mReference; + int mFeaturedLayerType; + int mLayerType; - RevealFinishedGingerbread(RevealAnimator target) { + RevealFinishedIceCreamSandwich(RevealAnimator target, int layerType) { mReference = new WeakReference<>(target); + mLayerType = ((View) target).getLayerType(); + mFeaturedLayerType = layerType; } @Override public void onAnimationStart(Animator animation) { RevealAnimator target = mReference.get(); + ((View) target).setLayerType(mFeaturedLayerType, null); target.onRevealAnimationStart(); } @Override public void onAnimationCancel(Animator animation) { RevealAnimator target = mReference.get(); + ((View) target).setLayerType(mLayerType, null); target.onRevealAnimationCancel(); } @Override public void onAnimationEnd(Animator animation) { RevealAnimator target = mReference.get(); + ((View) target).setLayerType(mLayerType, null); target.onRevealAnimationEnd(); } } - @TargetApi(Build.VERSION_CODES.HONEYCOMB) - class RevealFinishedIceCreamSandwich extends RevealFinishedGingerbread { - int mFeaturedLayerType; - int mLayerType; - - RevealFinishedIceCreamSandwich(RevealAnimator target) { - super(target); - - mLayerType = ((View) target).getLayerType(); - mFeaturedLayerType = View.LAYER_TYPE_SOFTWARE; - } - - @Override - public void onAnimationCancel(Animator animation) { - ((View) mReference.get()).setLayerType(mLayerType, null); - super.onAnimationEnd(animation); - } - - @Override - public void onAnimationStart(Animator animation) { - ((View) mReference.get()).setLayerType(mFeaturedLayerType, null); - super.onAnimationStart(animation); - } - - @Override - public void onAnimationEnd(Animator animation) { - ((View) mReference.get()).setLayerType(mLayerType, null); - super.onAnimationEnd(animation); - } - } - - class RevealFinishedJellyBeanMr2 extends RevealFinishedIceCreamSandwich { - - @TargetApi(Build.VERSION_CODES.HONEYCOMB) - RevealFinishedJellyBeanMr2(RevealAnimator target) { - super(target); - - mFeaturedLayerType = View.LAYER_TYPE_HARDWARE; - } - } - - class RevealRadius extends FloatProperty { + class RevealRadius extends Property { public RevealRadius() { - super("revealRadius"); + super(Float.class, "revealRadius"); } @Override - public void setValue(RevealAnimator object, float value) { + public void set(RevealAnimator object, Float value) { object.setRevealRadius(value); } diff --git a/circualreveal/src/main/java/io/codetail/animation/SupportAnimator.java b/circualreveal/src/main/java/io/codetail/animation/SupportAnimator.java index ca42f7c..1d73b39 100644 --- a/circualreveal/src/main/java/io/codetail/animation/SupportAnimator.java +++ b/circualreveal/src/main/java/io/codetail/animation/SupportAnimator.java @@ -1,10 +1,10 @@ package io.codetail.animation; -import android.view.animation.Interpolator; +import android.animation.Animator; import java.lang.ref.WeakReference; -public abstract class SupportAnimator { +public abstract class SupportAnimator extends Animator{ WeakReference mTarget; @@ -21,7 +21,7 @@ public SupportAnimator(RevealAnimator target) { /** * @return depends from {@link android.os.Build.VERSION} if sdk version * {@link android.os.Build.VERSION_CODES#LOLLIPOP} and greater will return - * {@link android.animation.Animator} otherwise {@link com.nineoldandroids.animation.Animator} + * {@link android.animation.Animator} */ public abstract Object get(); @@ -41,23 +41,6 @@ public SupportAnimator(RevealAnimator target) { */ public abstract void start(); - /** - * Sets the duration of the animation. - * - * @param duration The length of the animation, in milliseconds. - */ - public abstract void setDuration(int duration); - - /** - * The time interpolator used in calculating the elapsed fraction of the - * animation. The interpolator determines whether the animation runs with - * linear or non-linear motion, such as acceleration and deceleration. The - * default value is {@link android.view.animation.AccelerateDecelerateInterpolator}. - * - * @param value the interpolator to be used by this animation - */ - public abstract void setInterpolator(Interpolator value); - /** * Adds a listener to the set of listeners that are sent events through the life of an diff --git a/circualreveal/src/main/java/io/codetail/animation/SupportAnimatorLollipop.java b/circualreveal/src/main/java/io/codetail/animation/SupportAnimatorImpl.java similarity index 75% rename from circualreveal/src/main/java/io/codetail/animation/SupportAnimatorLollipop.java rename to circualreveal/src/main/java/io/codetail/animation/SupportAnimatorImpl.java index ec5827e..de0214c 100644 --- a/circualreveal/src/main/java/io/codetail/animation/SupportAnimatorLollipop.java +++ b/circualreveal/src/main/java/io/codetail/animation/SupportAnimatorImpl.java @@ -1,18 +1,18 @@ package io.codetail.animation; import android.animation.Animator; +import android.animation.TimeInterpolator; import android.annotation.TargetApi; import android.os.Build; -import android.view.animation.Interpolator; import java.lang.ref.WeakReference; @TargetApi(Build.VERSION_CODES.HONEYCOMB) -final class SupportAnimatorLollipop extends SupportAnimator{ +final class SupportAnimatorImpl extends SupportAnimator{ WeakReference mAnimator; - SupportAnimatorLollipop(Animator animator, RevealAnimator target) { + SupportAnimatorImpl(Animator animator, RevealAnimator target) { super(target); mAnimator = new WeakReference<>(animator); } @@ -37,15 +37,16 @@ public void start() { } @Override - public void setDuration(int duration) { + public Animator setDuration(long duration) { Animator a = mAnimator.get(); if(a != null) { a.setDuration(duration); } + return this; } @Override - public void setInterpolator(Interpolator value) { + public void setInterpolator(TimeInterpolator value) { Animator a = mAnimator.get(); if(a != null) { a.setInterpolator(value); @@ -109,6 +110,32 @@ public void end() { } } + @Override + public long getStartDelay() { + Animator a = mAnimator.get(); + if(a != null){ + return a.getStartDelay(); + } + return 0; + } + + @Override + public void setStartDelay(long startDelay) { + Animator a = mAnimator.get(); + if(a != null){ + a.setStartDelay(startDelay); + } + } + + @Override + public long getDuration() { + Animator a = mAnimator.get(); + if(a != null){ + return a.getDuration(); + } + return 0; + } + @Override public void setupStartValues() { Animator a = mAnimator.get(); diff --git a/circualreveal/src/main/java/io/codetail/animation/SupportAnimatorPreL.java b/circualreveal/src/main/java/io/codetail/animation/SupportAnimatorPreL.java deleted file mode 100644 index 50e4f5a..0000000 --- a/circualreveal/src/main/java/io/codetail/animation/SupportAnimatorPreL.java +++ /dev/null @@ -1,124 +0,0 @@ -package io.codetail.animation; - -import android.view.animation.Interpolator; - -import com.nineoldandroids.animation.Animator; - -import java.lang.ref.WeakReference; - -final class SupportAnimatorPreL extends SupportAnimator { - - WeakReference mAnimator; - - SupportAnimatorPreL(Animator animator, RevealAnimator target) { - super(target); - mAnimator = new WeakReference<>(animator); - } - - @Override - public boolean isNativeAnimator() { - return false; - } - - @Override - public Object get() { - return mAnimator.get(); - } - - @Override - public void start() { - Animator a = mAnimator.get(); - if(a != null) { - a.start(); - } - } - - @Override - public void setDuration(int duration) { - Animator a = mAnimator.get(); - if(a != null) { - a.setDuration(duration); - } - } - - @Override - public void setInterpolator(Interpolator value) { - Animator a = mAnimator.get(); - if(a != null) { - a.setInterpolator(value); - } - } - - @Override - public void addListener(final AnimatorListener listener) { - Animator a = mAnimator.get(); - if(a == null) { - return; - } - - if(listener == null){ - a.addListener(null); - return; - } - - a.addListener(new Animator.AnimatorListener() { - @Override - public void onAnimationStart(Animator animation) { - listener.onAnimationStart(); - } - - @Override - public void onAnimationEnd(Animator animation) { - listener.onAnimationEnd(); - } - - @Override - public void onAnimationCancel(Animator animation) { - listener.onAnimationCancel(); - } - - @Override - public void onAnimationRepeat(Animator animation) { - listener.onAnimationRepeat(); - } - }); - } - - @Override - public boolean isRunning() { - Animator a = mAnimator.get(); - return a != null && a.isRunning(); - } - - @Override - public void cancel() { - Animator a = mAnimator.get(); - if(a != null){ - a.cancel(); - } - } - - @Override - public void end() { - Animator a = mAnimator.get(); - if(a != null){ - a.end(); - } - } - - @Override - public void setupStartValues() { - Animator a = mAnimator.get(); - if(a != null){ - a.setupStartValues(); - } - } - - @Override - public void setupEndValues() { - Animator a = mAnimator.get(); - if(a != null){ - a.setupEndValues(); - } - } -} diff --git a/circualreveal/src/main/java/io/codetail/animation/ViewAnimationUtils.java b/circualreveal/src/main/java/io/codetail/animation/ViewAnimationUtils.java index 8781fe7..5e654e8 100644 --- a/circualreveal/src/main/java/io/codetail/animation/ViewAnimationUtils.java +++ b/circualreveal/src/main/java/io/codetail/animation/ViewAnimationUtils.java @@ -1,15 +1,11 @@ package io.codetail.animation; +import android.animation.ObjectAnimator; import android.annotation.TargetApi; import android.os.Build; import android.view.View; import android.view.animation.AccelerateDecelerateInterpolator; -import com.nineoldandroids.animation.Animator; -import com.nineoldandroids.animation.ObjectAnimator; -import com.nineoldandroids.view.ViewHelper; -import com.nineoldandroids.view.ViewPropertyAnimator; - import java.lang.ref.WeakReference; import io.codetail.animation.RevealAnimator.RevealInfo; @@ -43,9 +39,37 @@ public class ViewAnimationUtils { * @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) { + + return createCircularReveal(view, centerX, centerY, startRadius, endRadius, View.LAYER_TYPE_SOFTWARE); + } + + /** + * Returns an Animator which can animate a clipping circle. + *

+ * Any shadow cast by the View will respect the circular clip from this animator. + *

+ * 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}. + *

+ * 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. + * + * @param layerType View layer type {@link View#LAYER_TYPE_HARDWARE} or {@link View#LAYER_TYPE_SOFTWARE} + */ + @TargetApi(Build.VERSION_CODES.LOLLIPOP) public static SupportAnimator createCircularReveal(View view, int centerX, int centerY, - float startRadius, float endRadius) { + float startRadius, float endRadius, int layerType) { if(!(view.getParent() instanceof RevealAnimator)){ throw new IllegalArgumentException("View must be inside RevealFrameLayout or RevealLinearLayout."); @@ -56,25 +80,13 @@ public static SupportAnimator createCircularReveal(View view, new WeakReference<>(view))); if(LOLLIPOP_PLUS){ - return new SupportAnimatorLollipop(android.view.ViewAnimationUtils + return new SupportAnimatorImpl(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); - } + ObjectAnimator reveal = ObjectAnimator.ofFloat(revealLayout, CLIP_RADIUS, startRadius, endRadius); + reveal.addListener(new RevealAnimator.RevealFinishedIceCreamSandwich(revealLayout, layerType)); + return new SupportAnimatorImpl(reveal, revealLayout); } /** @@ -88,11 +100,10 @@ private static Animator.AnimatorListener getRevealFinishListener(RevealAnimator */ @Deprecated public static void liftingFromBottom(View view, float baseRotation, float fromY, int duration, int startDelay){ - ViewHelper.setRotationX(view, baseRotation); - ViewHelper.setTranslationY(view, fromY); + view.setRotationX(baseRotation); + view.setTranslationY(fromY); - ViewPropertyAnimator - .animate(view) + view.animate() .setInterpolator(new AccelerateDecelerateInterpolator()) .setDuration(duration) .setStartDelay(startDelay) @@ -112,12 +123,10 @@ public static void liftingFromBottom(View view, float baseRotation, float fromY, */ @Deprecated public static void liftingFromBottom(View view, float baseRotation, int duration, int startDelay){ - ViewHelper.setRotationX(view, baseRotation); - ViewHelper.setTranslationY(view, view.getHeight() / 3); + view.setRotationX(baseRotation); + view.setTranslationY(view.getHeight() / 3); - ViewPropertyAnimator - .animate(view) - .setInterpolator(new AccelerateDecelerateInterpolator()) + view.animate().setInterpolator(new AccelerateDecelerateInterpolator()) .setDuration(duration) .setStartDelay(startDelay) .rotationX(0) @@ -135,40 +144,14 @@ public static void liftingFromBottom(View view, float baseRotation, int duration */ @Deprecated public static void liftingFromBottom(View view, float baseRotation, int duration){ - ViewHelper.setRotationX(view, baseRotation); - ViewHelper.setTranslationY(view, view.getHeight() / 3); + view.setRotationX(baseRotation); + view.setTranslationY(view.getHeight() / 3); - ViewPropertyAnimator - .animate(view) - .setInterpolator(new AccelerateDecelerateInterpolator()) + view.animate().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) { - - } - } - } diff --git a/gradle.properties b/gradle.properties index eea05f7..e5e1db5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,10 +15,12 @@ # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true +org.gradle.parallel=true +org.gradle.daemon=true + +VERSION_NAME=1.3.0 +VERSION_CODE=3 -VERSION_NAME=1.0.1 -VERSION_CODE=2 GROUP=com.github.ozodrukh POM_DESCRIPTION=Port of Lollipop circular reveal animation diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 43124cd..aa379f2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip