From a3a20a05b5dafa611248c463a3683e828916dd37 Mon Sep 17 00:00:00 2001 From: Victor Date: Tue, 5 May 2015 01:42:55 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20Drawable=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BB=D0=B0?= =?UTF-8?q?=D0=B2=D0=BD=D1=8B=D1=85=20=D0=BF=D0=B5=D1=80=D0=B5=D1=85=D0=BE?= =?UTF-8?q?=D0=B4=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TransitionAnimationDrawable.java | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 src/com/annimon/everlastingsummer/drawables/TransitionAnimationDrawable.java diff --git a/src/com/annimon/everlastingsummer/drawables/TransitionAnimationDrawable.java b/src/com/annimon/everlastingsummer/drawables/TransitionAnimationDrawable.java new file mode 100644 index 0000000..a500c7a --- /dev/null +++ b/src/com/annimon/everlastingsummer/drawables/TransitionAnimationDrawable.java @@ -0,0 +1,144 @@ +package com.annimon.everlastingsummer.drawables; + +import java.util.ArrayList; +import java.util.List; +import android.graphics.Canvas; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.LayerDrawable; +import android.os.SystemClock; + +/** + * Плавный переход между несколькими изображениями. + * @author aNNiMON + */ +public class TransitionAnimationDrawable extends LayerDrawable { + + private static final int TRANSITION_STARTING = 0; + private static final int TRANSITION_RUNNING = 1; + private static final int TRANSITION_NONE = 2; + + private final int fullDuration; + private final int[] durations; + + private final int lastIndex; + private int state; + private long startTime; + private int currentDuration; + private int fromIndex, toIndex; + + public TransitionAnimationDrawable(int fullDuration, int[] durations, Drawable[] drawables) { + super(drawables); + this.fullDuration = fullDuration; + this.durations = durations; + state = TRANSITION_NONE; + lastIndex = durations.length - 1; + } + + public int getFullDuration() { + return fullDuration; + } + + public void startTransition() { + fromIndex = 0; + toIndex = 1; + startTransitionAnimation(); + } + + private void startTransitionAnimation() { + currentDuration = durations[toIndex]; + state = TRANSITION_STARTING; + invalidateSelf(); + } + + @Override + public void draw(Canvas canvas) { + boolean done = false; + int alpha = 0; + + switch (state) { + case TRANSITION_STARTING: + startTime = SystemClock.uptimeMillis(); + state = TRANSITION_RUNNING; + break; + + case TRANSITION_RUNNING: + if (currentDuration <= 0) { + done = true; + alpha = 255; + break; + } + float value = (SystemClock.uptimeMillis() - startTime) / (float) currentDuration; + if (value >= 1.0f) { + done = true; + value = 1.0f; + } + alpha = (int) (255 * value); + break; + default: + done = true; + } + + if (done) { +// getDrawable(fromIndex).draw(canvas); + getDrawable(toIndex).draw(canvas); + if (state == TRANSITION_RUNNING) { + if (toIndex < lastIndex) { + // Новая итерация анимации + fromIndex++; + toIndex++; + startTransitionAnimation(); + } else { + state = TRANSITION_NONE; + } + } + return; + } + + // Рисуем подкладку + Drawable d = getDrawable(fromIndex); + d.draw(canvas); + + // Рисуем наложенное изображение с прозрачностью + if (alpha > 0) { + d = getDrawable(toIndex); + d.setAlpha(alpha); + d.draw(canvas); + } + + if (!done) invalidateSelf(); + } + + public static class Builder { + + private static final Drawable NONE = new ColorDrawable(); + + private int fullDuration; + private final List durations; + private final List drawables; + + public Builder() { + fullDuration = 0; + this.durations = new ArrayList(); + this.drawables = new ArrayList(); + } + + public Builder add(int duration, Drawable drawable) { + fullDuration += duration; + durations.add(duration); + drawables.add(drawable == null ? NONE : drawable); + return this; + } + + public TransitionAnimationDrawable build() { + final int size = durations.size(); + final int[] durationsArray = new int[size]; + final Drawable[] drawablesArray = new Drawable[size]; + for (int i = 0; i < size; i++) { + durationsArray[i] = durations.get(i); + drawablesArray[i] = drawables.get(i); + } + return new TransitionAnimationDrawable(fullDuration, durationsArray, drawablesArray); + } + } +}