2015-05-03 22:09:49 +03:00
|
|
|
|
package com.annimon.everlastingsummer;
|
|
|
|
|
|
|
|
|
|
import java.util.Locale;
|
|
|
|
|
import android.content.Context;
|
|
|
|
|
import android.graphics.Bitmap;
|
2015-05-05 12:30:35 +03:00
|
|
|
|
import android.graphics.Color;
|
2015-05-03 22:09:49 +03:00
|
|
|
|
import android.graphics.drawable.ColorDrawable;
|
|
|
|
|
import android.graphics.drawable.Drawable;
|
2015-05-05 12:30:35 +03:00
|
|
|
|
import android.graphics.drawable.LayerDrawable;
|
2015-05-03 22:09:49 +03:00
|
|
|
|
import android.util.AttributeSet;
|
2015-05-05 12:30:35 +03:00
|
|
|
|
import android.util.SparseArray;
|
2015-05-03 22:09:49 +03:00
|
|
|
|
import android.widget.ImageView;
|
2015-05-05 12:30:35 +03:00
|
|
|
|
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;
|
2015-05-03 22:09:49 +03:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* ImageView с поддержкой анимации переходов.
|
|
|
|
|
* @author aNNiMON
|
|
|
|
|
*/
|
|
|
|
|
public class AnimatableImageView extends ImageView {
|
|
|
|
|
|
2015-05-05 13:20:10 +03:00
|
|
|
|
private static final ColorDrawable NONE = new ColorDrawable();
|
|
|
|
|
|
2015-05-05 12:30:35 +03:00
|
|
|
|
private static final SparseArray<Drawable> colors;
|
2015-05-03 22:09:49 +03:00
|
|
|
|
static {
|
2015-05-05 12:30:35 +03:00
|
|
|
|
colors = new SparseArray<Drawable>();
|
2015-05-05 13:20:10 +03:00
|
|
|
|
colors.append(0, NONE);
|
2015-05-05 12:30:35 +03:00
|
|
|
|
colors.append(Color.WHITE, new ColorDrawable(Color.WHITE));
|
|
|
|
|
colors.append(Color.BLACK, new ColorDrawable(Color.BLACK));
|
|
|
|
|
colors.append(0xFFEE1111, new ColorDrawable(0xFFEE1111));
|
2015-05-03 22:09:49 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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-05 13:20:10 +03:00
|
|
|
|
return setAnimationEffect(effect);
|
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-05 12:30:35 +03:00
|
|
|
|
@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;
|
|
|
|
|
}
|
2015-05-05 13:20:10 +03:00
|
|
|
|
|
|
|
|
|
public void hideDrawable(String effect, Runnable runnable) {
|
|
|
|
|
final int delay = setImageDrawable(NONE, effect);
|
|
|
|
|
if (delay == 0) runnable.run();
|
|
|
|
|
else {
|
|
|
|
|
postDelayed(runnable, delay);
|
|
|
|
|
}
|
|
|
|
|
}
|
2015-05-05 12:30:35 +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-05 12:30:35 +03:00
|
|
|
|
if (!Transitions.contains(effect)) return 0;
|
2015-05-03 22:09:49 +03:00
|
|
|
|
|
2015-05-05 12:30:35 +03:00
|
|
|
|
final Transition transition = Transitions.get(effect);
|
|
|
|
|
switch (transition.type()) {
|
|
|
|
|
|
|
|
|
|
case Transition.TYPE_FADE: {
|
|
|
|
|
final TransitionAnimationDrawable drawable = fade((Fade) transition);
|
|
|
|
|
setImageDrawable(drawable);
|
|
|
|
|
drawable.startTransition();
|
|
|
|
|
return drawable.getFullDuration();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case Transition.TYPE_DISSOLVE: {
|
|
|
|
|
final Dissolve dissolve = (Dissolve) transition;
|
|
|
|
|
final int delay = dissolve.getDelay();
|
|
|
|
|
final TransitionAnimationDrawable drawable =
|
|
|
|
|
new TransitionAnimationDrawable(delay, previous, getDrawable());
|
|
|
|
|
setImageDrawable(drawable);
|
|
|
|
|
drawable.setCrossFadeEnabled(true);
|
|
|
|
|
drawable.startTransition();
|
|
|
|
|
return drawable.getFullDuration();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
2015-05-03 22:09:49 +03:00
|
|
|
|
}
|
2015-05-05 12:30:35 +03:00
|
|
|
|
|
|
|
|
|
private TransitionAnimationDrawable fade(Fade fade) {
|
|
|
|
|
final int fadeColor = fade.getColor();
|
2015-05-03 22:09:49 +03:00
|
|
|
|
|
2015-05-05 12:30:35 +03:00
|
|
|
|
// Достаём ColorDrawable из кэша или создаём новый и кладём в кэш
|
|
|
|
|
Drawable fadeColorDrawable;
|
|
|
|
|
if (colors.indexOfKey(fadeColor) < 0) {
|
|
|
|
|
fadeColorDrawable = new ColorDrawable(fadeColor);
|
|
|
|
|
colors.put(fadeColor, fadeColorDrawable);
|
|
|
|
|
} else {
|
|
|
|
|
fadeColorDrawable = colors.get(fadeColor);
|
2015-05-03 22:09:49 +03:00
|
|
|
|
}
|
|
|
|
|
|
2015-05-05 12:30:35 +03:00
|
|
|
|
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)); // копия обязательна!
|
2015-05-03 22:09:49 +03:00
|
|
|
|
}
|
2015-05-05 12:30:35 +03:00
|
|
|
|
// color -> img2
|
|
|
|
|
builder.add(fade.getInTime(), getDrawable());
|
|
|
|
|
return builder.build();
|
2015-05-03 22:09:49 +03:00
|
|
|
|
}
|
|
|
|
|
}
|