2015-05-03 22:09:49 +03:00
|
|
|
|
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<String, Anim> animations;
|
|
|
|
|
static {
|
|
|
|
|
animations = new HashMap<String, AnimatableImageView.Anim>();
|
|
|
|
|
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, "");
|
|
|
|
|
}
|
|
|
|
|
|
2015-05-04 16:18:07 +03:00
|
|
|
|
public int setImageResource(int resId, String effect) {
|
2015-05-03 22:09:49 +03:00
|
|
|
|
previous = getDrawable();
|
|
|
|
|
super.setImageResource(resId);
|
2015-05-04 16:18:07 +03:00
|
|
|
|
return setAnimationEffect(effect);
|
2015-05-03 22:09:49 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void setImageDrawable(Drawable drawable) {
|
|
|
|
|
setImageDrawable(drawable, "");
|
|
|
|
|
}
|
|
|
|
|
|
2015-05-04 16:18:07 +03:00
|
|
|
|
public int setImageDrawable(Drawable drawable, String effect) {
|
2015-05-03 22:09:49 +03:00
|
|
|
|
previous = getDrawable();
|
|
|
|
|
super.setImageDrawable(drawable);
|
2015-05-04 16:18:07 +03:00
|
|
|
|
return setAnimationEffect("");
|
2015-05-03 22:09:49 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void setImageBitmap(Bitmap bm) {
|
|
|
|
|
setImageBitmap(bm, "");
|
|
|
|
|
}
|
|
|
|
|
|
2015-05-04 16:18:07 +03:00
|
|
|
|
public int setImageBitmap(Bitmap bm, String effect) {
|
2015-05-03 22:09:49 +03:00
|
|
|
|
previous = getDrawable();
|
|
|
|
|
super.setImageBitmap(bm);
|
2015-05-04 16:18:07 +03:00
|
|
|
|
return setAnimationEffect(effect);
|
2015-05-03 22:09:49 +03:00
|
|
|
|
}
|
|
|
|
|
|
2015-05-04 16:18:07 +03:00
|
|
|
|
private int setAnimationEffect(String animEffect) {
|
2015-05-03 22:09:49 +03:00
|
|
|
|
final String effect = animEffect.toLowerCase(Locale.ENGLISH);
|
2015-05-04 16:18:07 +03:00
|
|
|
|
if (!animations.containsKey(effect)) return 0;
|
2015-05-03 22:09:49 +03:00
|
|
|
|
|
|
|
|
|
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);
|
2015-05-04 16:18:07 +03:00
|
|
|
|
return anim.duration;
|
2015-05-03 22:09:49 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|