From e0635c3f0021b29eacd106f18b99f3f92967a052 Mon Sep 17 00:00:00 2001 From: Victor Date: Tue, 5 May 2015 12:30:35 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D1=91?= =?UTF-8?q?=D0=BD=20AnimatableImageView=20=D0=B4=D0=BB=D1=8F=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D0=B8=20TransitionAn?= =?UTF-8?q?imationDrawable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AnimatableImageView.java | 123 ++++++++++-------- 1 file changed, 69 insertions(+), 54 deletions(-) diff --git a/src/com/annimon/everlastingsummer/AnimatableImageView.java b/src/com/annimon/everlastingsummer/AnimatableImageView.java index d4ce006..c7736ed 100644 --- a/src/com/annimon/everlastingsummer/AnimatableImageView.java +++ b/src/com/annimon/everlastingsummer/AnimatableImageView.java @@ -1,15 +1,20 @@ package com.annimon.everlastingsummer; -import java.util.HashMap; import java.util.Locale; -import java.util.Map; import android.content.Context; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; -import android.graphics.drawable.TransitionDrawable; +import android.graphics.drawable.LayerDrawable; import android.util.AttributeSet; +import android.util.SparseArray; import android.widget.ImageView; +import com.annimon.everlastingsummer.drawables.TransitionAnimationDrawable; +import com.annimon.everlastingsummer.transitions.Dissolve; +import com.annimon.everlastingsummer.transitions.Fade; +import com.annimon.everlastingsummer.transitions.Transition; +import com.annimon.everlastingsummer.transitions.Transitions; /** * ImageView с поддержкой анимации переходов. @@ -17,32 +22,12 @@ import android.widget.ImageView; */ public class AnimatableImageView extends ImageView { - private static final Drawable BLACK_DRAWABLE = new ColorDrawable(0xFF000000); - private static final Drawable WHITE_DRAWABLE = new ColorDrawable(0xFFFFFFFF); - private static final Drawable RED_DRAWABLE = new ColorDrawable(0xFFFF0000); - - private static final Anim FADE = new Anim(1000, BLACK_DRAWABLE); - private static final Anim FADE2 = new Anim(2000, BLACK_DRAWABLE); - private static final Anim FADE3 = new Anim(3000, BLACK_DRAWABLE); - private static final Anim DSPR = new Anim(200); - private static final Anim DISSOLVE = new Anim(1000); - private static final Anim DISSOLVE2 = new Anim(2000); - private static final Anim FLASH = new Anim(1000, WHITE_DRAWABLE); - private static final Anim FLASH2 = new Anim(2000, WHITE_DRAWABLE); - private static final Anim FLASH_RED = new Anim(1000, RED_DRAWABLE); - - private static final Map animations; + private static final SparseArray colors; static { - animations = new HashMap(); - animations.put("fade", FADE); - animations.put("fade2", FADE2); - animations.put("fade3", FADE3); - animations.put("dspr", DSPR); - animations.put("dissolve", DISSOLVE); - animations.put("dissolve2", DISSOLVE2); - animations.put("flash", FLASH); - animations.put("flash2", FLASH2); - animations.put("flash_red", FLASH_RED); + colors = new SparseArray(); + colors.append(Color.WHITE, new ColorDrawable(Color.WHITE)); + colors.append(Color.BLACK, new ColorDrawable(Color.BLACK)); + colors.append(0xFFEE1111, new ColorDrawable(0xFFEE1111)); } private Drawable previous; @@ -92,39 +77,69 @@ public class AnimatableImageView extends ImageView { return setAnimationEffect(effect); } + @Override + public Drawable getDrawable() { + final Drawable result = super.getDrawable(); + if (result == null) return new ColorDrawable(); + if (result instanceof LayerDrawable) { + final LayerDrawable ld = (LayerDrawable) result; + return ld.getDrawable(ld.getNumberOfLayers() - 1); + } + return result; + } + private int setAnimationEffect(String animEffect) { final String effect = animEffect.toLowerCase(Locale.ENGLISH); - if (!animations.containsKey(effect)) return 0; + if (!Transitions.contains(effect)) return 0; - final Anim anim = animations.get(effect); - - final Drawable[] layers = new Drawable[2]; - layers[0] = anim.usePreviousDrawable ? previous : anim.drawable; - layers[1] = getDrawable(); - - final TransitionDrawable transition = new TransitionDrawable(layers); - setImageDrawable(transition); - transition.startTransition(anim.duration); - return anim.duration; + final Transition transition = Transitions.get(effect); + switch (transition.type()) { + + case Transition.TYPE_FADE: { + final TransitionAnimationDrawable drawable = fade((Fade) transition); + setImageDrawable(drawable); + drawable.startTransition(); + return drawable.getFullDuration(); + } + + case Transition.TYPE_DISSOLVE: { + final Dissolve dissolve = (Dissolve) transition; + final int delay = dissolve.getDelay(); + final TransitionAnimationDrawable drawable = + new TransitionAnimationDrawable(delay, previous, getDrawable()); + setImageDrawable(drawable); + drawable.setCrossFadeEnabled(true); + drawable.startTransition(); + return drawable.getFullDuration(); + } + + default: + return 0; + } } - - private static class Anim { - final int duration; - final boolean usePreviousDrawable; - final Drawable drawable; + + private TransitionAnimationDrawable fade(Fade fade) { + final int fadeColor = fade.getColor(); - Anim(int duration) { - this(duration, true, null); + // Достаём ColorDrawable из кэша или создаём новый и кладём в кэш + Drawable fadeColorDrawable; + if (colors.indexOfKey(fadeColor) < 0) { + fadeColorDrawable = new ColorDrawable(fadeColor); + colors.put(fadeColor, fadeColorDrawable); + } else { + fadeColorDrawable = colors.get(fadeColor); } - Anim(int duration, Drawable drawable) { - this(duration, false, drawable); - } - - Anim(int duration, boolean usePreviousDrawable, Drawable drawable) { - this.duration = duration; - this.usePreviousDrawable = usePreviousDrawable; - this.drawable = drawable; + final TransitionAnimationDrawable.Builder builder = new TransitionAnimationDrawable.Builder(); + builder.add(0, previous); + // img1 -> color + builder.add(fade.getOutTime(), fadeColorDrawable); + if (fade.getHoldTime() > 0) { + // color ~ color + builder.add(fade.getHoldTime(), new ColorDrawable(fadeColor)); // копия обязательна! } + // color -> img2 + builder.add(fade.getInTime(), getDrawable()); + return builder.build(); } }