Обновлён AnimatableImageView для поддержки TransitionAnimationDrawable

This commit is contained in:
Victor 2015-05-05 12:30:35 +03:00
parent 0f8ae9f4ea
commit e0635c3f00

View File

@ -1,15 +1,20 @@
package com.annimon.everlastingsummer; package com.annimon.everlastingsummer;
import java.util.HashMap;
import java.util.Locale; import java.util.Locale;
import java.util.Map;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.graphics.drawable.TransitionDrawable; import android.graphics.drawable.LayerDrawable;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.SparseArray;
import android.widget.ImageView; 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 с поддержкой анимации переходов. * ImageView с поддержкой анимации переходов.
@ -17,32 +22,12 @@ import android.widget.ImageView;
*/ */
public class AnimatableImageView extends ImageView { public class AnimatableImageView extends ImageView {
private static final Drawable BLACK_DRAWABLE = new ColorDrawable(0xFF000000); private static final SparseArray<Drawable> colors;
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 { static {
animations = new HashMap<String, AnimatableImageView.Anim>(); colors = new SparseArray<Drawable>();
animations.put("fade", FADE); colors.append(Color.WHITE, new ColorDrawable(Color.WHITE));
animations.put("fade2", FADE2); colors.append(Color.BLACK, new ColorDrawable(Color.BLACK));
animations.put("fade3", FADE3); colors.append(0xFFEE1111, new ColorDrawable(0xFFEE1111));
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; private Drawable previous;
@ -92,39 +77,69 @@ public class AnimatableImageView extends ImageView {
return setAnimationEffect(effect); 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) { private int setAnimationEffect(String animEffect) {
final String effect = animEffect.toLowerCase(Locale.ENGLISH); 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 Transition transition = Transitions.get(effect);
switch (transition.type()) {
final Drawable[] layers = new Drawable[2]; case Transition.TYPE_FADE: {
layers[0] = anim.usePreviousDrawable ? previous : anim.drawable; final TransitionAnimationDrawable drawable = fade((Fade) transition);
layers[1] = getDrawable(); setImageDrawable(drawable);
drawable.startTransition();
final TransitionDrawable transition = new TransitionDrawable(layers); return drawable.getFullDuration();
setImageDrawable(transition);
transition.startTransition(anim.duration);
return anim.duration;
} }
private static class Anim { case Transition.TYPE_DISSOLVE: {
final int duration; final Dissolve dissolve = (Dissolve) transition;
final boolean usePreviousDrawable; final int delay = dissolve.getDelay();
final Drawable drawable; final TransitionAnimationDrawable drawable =
new TransitionAnimationDrawable(delay, previous, getDrawable());
Anim(int duration) { setImageDrawable(drawable);
this(duration, true, null); drawable.setCrossFadeEnabled(true);
drawable.startTransition();
return drawable.getFullDuration();
} }
Anim(int duration, Drawable drawable) { default:
this(duration, false, drawable); return 0;
}
} }
Anim(int duration, boolean usePreviousDrawable, Drawable drawable) { private TransitionAnimationDrawable fade(Fade fade) {
this.duration = duration; final int fadeColor = fade.getColor();
this.usePreviousDrawable = usePreviousDrawable;
this.drawable = drawable; // Достаём ColorDrawable из кэша или создаём новый и кладём в кэш
Drawable fadeColorDrawable;
if (colors.indexOfKey(fadeColor) < 0) {
fadeColorDrawable = new ColorDrawable(fadeColor);
colors.put(fadeColor, fadeColorDrawable);
} else {
fadeColorDrawable = colors.get(fadeColor);
} }
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();
} }
} }