From 36a8a5bd170f4a18b1cd060675f5620f7d63f48e Mon Sep 17 00:00:00 2001 From: Thorsten Giesecke Date: Sun, 1 Feb 2015 17:52:08 +0100 Subject: [PATCH] compatibility with v7 + (using ViewCompat and NineOldAndroids) --- build.gradle | 13 ++-- src/main/java/at/markushi/ui/ActionView.java | 5 +- .../java/at/markushi/ui/RevealColorView.java | 59 ++++++++++++++----- .../java/at/markushi/ui/util/UiHelper.java | 10 +++- 4 files changed, 62 insertions(+), 25 deletions(-) diff --git a/build.gradle b/build.gradle index ea52106..5866739 100644 --- a/build.gradle +++ b/build.gradle @@ -3,28 +3,29 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:0.12.+' + classpath 'com.android.tools.build:gradle:1.0.1' } } -apply plugin: 'android-library' +apply plugin: 'com.android.library' repositories { mavenCentral() } android { - compileSdkVersion 19 - buildToolsVersion "20" + compileSdkVersion 21 + buildToolsVersion "21.1.2" defaultConfig { - minSdkVersion 14 + minSdkVersion 7 versionName = VERSION_NAME versionCode = VERSION_CODE } } dependencies { - + compile 'com.android.support:support-v4:21.0.3' + compile 'com.nineoldandroids:library:2.4.0' } allprojects { diff --git a/src/main/java/at/markushi/ui/ActionView.java b/src/main/java/at/markushi/ui/ActionView.java index 4b39295..dce79e3 100644 --- a/src/main/java/at/markushi/ui/ActionView.java +++ b/src/main/java/at/markushi/ui/ActionView.java @@ -1,6 +1,5 @@ package at.markushi.ui; -import android.animation.ObjectAnimator; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; @@ -12,6 +11,8 @@ import android.util.TypedValue; import android.view.View; +import com.nineoldandroids.animation.ObjectAnimator; + import at.markushi.ui.action.Action; import at.markushi.ui.action.BackAction; import at.markushi.ui.action.CloseAction; @@ -217,7 +218,7 @@ public void setAction(final Action fromAction, final Action toAction, final int postDelayed(new Runnable() { @Override public void run() { - if (!isAttachedToWindow()) { + if (!UiHelper.isAttachedToWindow(ActionView.this)) { return; } setAction(toAction, true, rotation); diff --git a/src/main/java/at/markushi/ui/RevealColorView.java b/src/main/java/at/markushi/ui/RevealColorView.java index 7f10f35..663383f 100644 --- a/src/main/java/at/markushi/ui/RevealColorView.java +++ b/src/main/java/at/markushi/ui/RevealColorView.java @@ -1,15 +1,17 @@ package at.markushi.ui; -import android.animation.Animator; import android.content.Context; import android.graphics.Color; import android.graphics.drawable.ShapeDrawable; import android.graphics.drawable.shapes.OvalShape; -import android.os.Build; +import android.support.v4.view.ViewCompat; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; -import android.view.ViewPropertyAnimator; + +import com.nineoldandroids.animation.Animator; +import com.nineoldandroids.view.ViewHelper; +import com.nineoldandroids.view.ViewPropertyAnimator; import at.markushi.ui.util.BakedBezierInterpolator; import at.markushi.ui.util.UiHelper; @@ -89,9 +91,17 @@ public void reveal(final int x, final int y, final int color, final int startRad final float finalScale = calculateScale(x, y) * SCALE; prepareView(inkView, x, y, startScale); - animator = inkView.animate().scaleX(finalScale).scaleY(finalScale).setDuration(duration).setListener(new Animator.AnimatorListener() { + animator = ViewPropertyAnimator.animate(inkView).scaleX(finalScale).scaleY(finalScale).setDuration(duration).setListener(new Animator.AnimatorListener() { + + private int layerType; + @Override public void onAnimationStart(Animator animator) { + if (inkView != null) { + ViewCompat.setHasTransientState(inkView, true); + layerType = ViewCompat.getLayerType(inkView); + ViewCompat.setLayerType(inkView, ViewCompat.LAYER_TYPE_HARDWARE, null); + } if (listener != null) { listener.onAnimationStart(animator); } @@ -100,7 +110,11 @@ public void onAnimationStart(Animator animator) { @Override public void onAnimationEnd(Animator animation) { setBackgroundColor(color); - inkView.setVisibility(View.INVISIBLE); + if (inkView != null) { + inkView.setVisibility(View.INVISIBLE); + ViewCompat.setLayerType(inkView, layerType, null); + ViewCompat.setHasTransientState(inkView, false); + } if (listener != null) { listener.onAnimationEnd(animation); } @@ -144,9 +158,17 @@ public void hide(final int x, final int y, final int color, final int endRadius, prepareView(inkView, x, y, startScale); - animator = inkView.animate().scaleX(finalScale).scaleY(finalScale).setDuration(duration).setListener(new Animator.AnimatorListener() { + animator = ViewPropertyAnimator.animate(inkView).scaleX(finalScale).scaleY(finalScale).setDuration(duration).setListener(new Animator.AnimatorListener() { + + private int layerType; + @Override public void onAnimationStart(Animator animator) { + if (inkView != null) { + ViewCompat.setHasTransientState(inkView, true); + layerType = ViewCompat.getLayerType(inkView); + ViewCompat.setLayerType(inkView, ViewCompat.LAYER_TYPE_HARDWARE, null); + } if (listener != null) { listener.onAnimationStart(animator); } @@ -154,7 +176,11 @@ public void onAnimationStart(Animator animator) { @Override public void onAnimationEnd(Animator animation) { - inkView.setVisibility(View.INVISIBLE); + if (inkView != null) { + inkView.setVisibility(View.INVISIBLE); + ViewCompat.setLayerType(inkView, layerType, null); + ViewCompat.setHasTransientState(inkView, false); + } if (listener != null) { listener.onAnimationEnd(animation); } @@ -179,9 +205,8 @@ public void onAnimationRepeat(Animator animator) { } public ViewPropertyAnimator prepareAnimator(ViewPropertyAnimator animator, int type) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - animator.withLayer(); - } + // ViewPropertyAnimator.withLayer() is not supported by Jake Wharton's NineOldAndroids, + // therefore we handle it inside the specific AnimatorListener. animator.setInterpolator(BakedBezierInterpolator.getInstance()); return animator; } @@ -189,12 +214,14 @@ public ViewPropertyAnimator prepareAnimator(ViewPropertyAnimator animator, int t private void prepareView(View view, int x, int y, float scale) { final int centerX = (view.getWidth() / 2); final int centerY = (view.getHeight() / 2); - view.setTranslationX(x - centerX); - view.setTranslationY(y - centerY); - view.setPivotX(centerX); - view.setPivotY(centerY); - view.setScaleX(scale); - view.setScaleY(scale); + + ViewHelper.setTranslationX(view, x - centerX); + ViewHelper.setTranslationX(view, x - centerX); + ViewHelper.setTranslationY(view, y - centerY); + ViewHelper.setPivotX(view, centerX); + ViewHelper.setPivotY(view, centerY); + ViewHelper.setScaleX(view, scale); + ViewHelper.setScaleY(view, scale); } /** diff --git a/src/main/java/at/markushi/ui/util/UiHelper.java b/src/main/java/at/markushi/ui/util/UiHelper.java index 4d6107c..496cf80 100644 --- a/src/main/java/at/markushi/ui/util/UiHelper.java +++ b/src/main/java/at/markushi/ui/util/UiHelper.java @@ -22,4 +22,12 @@ public static void postInvalidateOnAnimation(View view) { view.invalidate(); } } -} + + public static boolean isAttachedToWindow(View view) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + return view.isAttachedToWindow(); + } else { + return view.getHandler() != null; + } + } +} \ No newline at end of file