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 int setImageResource(int resId, String effect) { previous = getDrawable(); super.setImageResource(resId); return setAnimationEffect(effect); } @Override public void setImageDrawable(Drawable drawable) { setImageDrawable(drawable, ""); } public int setImageDrawable(Drawable drawable, String effect) { previous = getDrawable(); super.setImageDrawable(drawable); return setAnimationEffect(""); } @Override public void setImageBitmap(Bitmap bm) { setImageBitmap(bm, ""); } public int setImageBitmap(Bitmap bm, String effect) { previous = getDrawable(); super.setImageBitmap(bm); return setAnimationEffect(effect); } private int setAnimationEffect(String animEffect) { final String effect = animEffect.toLowerCase(Locale.ENGLISH); if (!animations.containsKey(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; } 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; } } }