RpyPlayer/src/com/annimon/everlastingsummer/AnimatableImageView.java

131 lines
4.3 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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, "");
}
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;
}
}
}