From 9ac6c371efbc4b916c51773fdeb3bc6ee3ef90b9 Mon Sep 17 00:00:00 2001 From: Victor Date: Sun, 3 May 2015 22:09:49 +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=20ImageView=20=D1=81=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5?= =?UTF-8?q?=D1=80=D0=B6=D0=BA=D0=BE=D0=B9=20=D0=B0=D0=BD=D0=B8=D0=BC=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20=D0=BF=D0=B5=D1=80=D0=B5=D1=85=D0=BE=D0=B4?= =?UTF-8?q?=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AnimatableImageView.java | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 src/com/annimon/everlastingsummer/AnimatableImageView.java diff --git a/src/com/annimon/everlastingsummer/AnimatableImageView.java b/src/com/annimon/everlastingsummer/AnimatableImageView.java new file mode 100644 index 0000000..ac9453f --- /dev/null +++ b/src/com/annimon/everlastingsummer/AnimatableImageView.java @@ -0,0 +1,129 @@ +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.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.TransitionDrawable; +import android.util.AttributeSet; +import android.widget.ImageView; + +/** + * ImageView с поддержкой анимации переходов. + * @author aNNiMON + */ +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; + 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); + } + + private Drawable previous; + + public AnimatableImageView(Context context) { + super(context); + } + + public AnimatableImageView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public AnimatableImageView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + public void setImageResource(int resId) { + setImageResource(resId, ""); + } + + public void setImageResource(int resId, String effect) { + previous = getDrawable(); + super.setImageResource(resId); + setAnimationEffect(effect); + } + + @Override + public void setImageDrawable(Drawable drawable) { + setImageDrawable(drawable, ""); + } + + public void setImageDrawable(Drawable drawable, String effect) { + previous = getDrawable(); + super.setImageDrawable(drawable); + setAnimationEffect(""); + } + + @Override + public void setImageBitmap(Bitmap bm) { + setImageBitmap(bm, ""); + } + + public void setImageBitmap(Bitmap bm, String effect) { + previous = getDrawable(); + super.setImageBitmap(bm); + setAnimationEffect(effect); + } + + private void setAnimationEffect(String animEffect) { + final String effect = animEffect.toLowerCase(Locale.ENGLISH); + if (!animations.containsKey(effect)) return; + + 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); + } + + private static class Anim { + final int duration; + final boolean usePreviousDrawable; + final Drawable drawable; + + Anim(int duration) { + this(duration, true, null); + } + + 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; + } + } +}