From 2791bc3b81ee180c64b12efe0b8dc9e6d28da7fa Mon Sep 17 00:00:00 2001 From: Gavriil Sitnikov Date: Thu, 16 Jun 2016 20:12:08 +0300 Subject: [PATCH] material progress drawable changed to be animated --- .../views/MaterialProgressDrawable.java | 82 ++++++++----------- 1 file changed, 35 insertions(+), 47 deletions(-) diff --git a/src/main/java/ru/touchin/roboswag/components/views/MaterialProgressDrawable.java b/src/main/java/ru/touchin/roboswag/components/views/MaterialProgressDrawable.java index e3f2f06..350d68f 100644 --- a/src/main/java/ru/touchin/roboswag/components/views/MaterialProgressDrawable.java +++ b/src/main/java/ru/touchin/roboswag/components/views/MaterialProgressDrawable.java @@ -27,40 +27,27 @@ import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.RectF; +import android.graphics.drawable.Animatable; import android.graphics.drawable.Drawable; -import android.os.Build; import android.os.SystemClock; import android.support.annotation.ColorInt; import android.support.annotation.NonNull; import android.util.TypedValue; -import java.lang.ref.WeakReference; -import java.lang.reflect.Field; - import ru.touchin.roboswag.components.utils.UiUtils; -import ru.touchin.roboswag.core.log.Lc; /** * Created by Gavriil Sitnikov on 03/16. * TODO */ -public class MaterialProgressDrawable extends Drawable { +public class MaterialProgressDrawable extends Drawable implements Runnable, Animatable { private static final int UPDATE_INTERVAL = 10; private static final float DEFAULT_STROKE_WIDTH_DP = 4.5f; private static final Parameters DEFAULT_PARAMETERS = new Parameters(20, 270, 4, 12, 4, 8); - private WeakReference lastDrawCallback; - private final Paint paint; - private final Runnable loop = new Runnable() { - @Override - public void run() { - scheduleSelf(this, animationStartTime + animationCycle * UPDATE_INTERVAL); - invalidateSelf(); - } - }; private Parameters parameters; private long animationStartTime; @@ -68,6 +55,7 @@ public class MaterialProgressDrawable extends Drawable { private float rotationAngle; private float arcSize; private final RectF arcBounds = new RectF(); + private boolean running; public MaterialProgressDrawable(@NonNull final Context context) { super(); @@ -118,22 +106,6 @@ public class MaterialProgressDrawable extends Drawable { arcBounds.inset(paint.getStrokeWidth() / 2, paint.getStrokeWidth() / 2); } - private Callback getInternalCallback() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - return getCallback(); - } - - try { - final Field field = Drawable.class.getDeclaredField("mCallback"); - field.setAccessible(true); - return (Callback) field.get(this); - } catch (final Exception ex) { - Lc.assertion(ex); - return null; - } - - } - @Override public void unscheduleSelf(final Runnable what) { super.unscheduleSelf(what); @@ -141,24 +113,9 @@ public class MaterialProgressDrawable extends Drawable { animationCycle = 0; } + @SuppressWarnings("PMD.NPathComplexity") @Override public void draw(final Canvas canvas) { - final Callback currentCallback = getInternalCallback(); - - if (lastDrawCallback == null || lastDrawCallback.get() != currentCallback) { - unscheduleSelf(loop); - } - - drawArc(canvas); - - if (lastDrawCallback == null || lastDrawCallback.get() != currentCallback) { - lastDrawCallback = new WeakReference<>(currentCallback); - loop.run(); - } - } - - @SuppressWarnings("PMD.NPathComplexity") - private void drawArc(final Canvas canvas) { final boolean isGrowingCycle = (((int) (arcSize / parameters.maxAngle)) % 2) == 0; final float angle = arcSize % parameters.maxAngle; final float shift = (angle / parameters.maxAngle) * parameters.gapAngle; @@ -169,6 +126,9 @@ public class MaterialProgressDrawable extends Drawable { if (arcSize < 0) { arcSize = 0; } + if (isRunning()) { + scheduleSelf(this, animationStartTime + animationCycle * UPDATE_INTERVAL); + } } @Override @@ -188,6 +148,34 @@ public class MaterialProgressDrawable extends Drawable { return PixelFormat.TRANSLUCENT; } + @Override + public void start() { + if (!running) { + running = true; + run(); + } + } + + @Override + public void stop() { + if (running) { + unscheduleSelf(this); + running = false; + } + } + + @Override + public boolean isRunning() { + return running; + } + + @Override + public void run() { + if (running) { + invalidateSelf(); + } + } + public static class Parameters { private final float gapAngle;