Добавлен Drawable для плавных переходов
This commit is contained in:
parent
2218b6d07b
commit
a3a20a05b5
@ -0,0 +1,144 @@
|
|||||||
|
package com.annimon.everlastingsummer.drawables;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.drawable.ColorDrawable;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.graphics.drawable.LayerDrawable;
|
||||||
|
import android.os.SystemClock;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Плавный переход между несколькими изображениями.
|
||||||
|
* @author aNNiMON
|
||||||
|
*/
|
||||||
|
public class TransitionAnimationDrawable extends LayerDrawable {
|
||||||
|
|
||||||
|
private static final int TRANSITION_STARTING = 0;
|
||||||
|
private static final int TRANSITION_RUNNING = 1;
|
||||||
|
private static final int TRANSITION_NONE = 2;
|
||||||
|
|
||||||
|
private final int fullDuration;
|
||||||
|
private final int[] durations;
|
||||||
|
|
||||||
|
private final int lastIndex;
|
||||||
|
private int state;
|
||||||
|
private long startTime;
|
||||||
|
private int currentDuration;
|
||||||
|
private int fromIndex, toIndex;
|
||||||
|
|
||||||
|
public TransitionAnimationDrawable(int fullDuration, int[] durations, Drawable[] drawables) {
|
||||||
|
super(drawables);
|
||||||
|
this.fullDuration = fullDuration;
|
||||||
|
this.durations = durations;
|
||||||
|
state = TRANSITION_NONE;
|
||||||
|
lastIndex = durations.length - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getFullDuration() {
|
||||||
|
return fullDuration;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void startTransition() {
|
||||||
|
fromIndex = 0;
|
||||||
|
toIndex = 1;
|
||||||
|
startTransitionAnimation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void startTransitionAnimation() {
|
||||||
|
currentDuration = durations[toIndex];
|
||||||
|
state = TRANSITION_STARTING;
|
||||||
|
invalidateSelf();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void draw(Canvas canvas) {
|
||||||
|
boolean done = false;
|
||||||
|
int alpha = 0;
|
||||||
|
|
||||||
|
switch (state) {
|
||||||
|
case TRANSITION_STARTING:
|
||||||
|
startTime = SystemClock.uptimeMillis();
|
||||||
|
state = TRANSITION_RUNNING;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TRANSITION_RUNNING:
|
||||||
|
if (currentDuration <= 0) {
|
||||||
|
done = true;
|
||||||
|
alpha = 255;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
float value = (SystemClock.uptimeMillis() - startTime) / (float) currentDuration;
|
||||||
|
if (value >= 1.0f) {
|
||||||
|
done = true;
|
||||||
|
value = 1.0f;
|
||||||
|
}
|
||||||
|
alpha = (int) (255 * value);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
done = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (done) {
|
||||||
|
// getDrawable(fromIndex).draw(canvas);
|
||||||
|
getDrawable(toIndex).draw(canvas);
|
||||||
|
if (state == TRANSITION_RUNNING) {
|
||||||
|
if (toIndex < lastIndex) {
|
||||||
|
// Новая итерация анимации
|
||||||
|
fromIndex++;
|
||||||
|
toIndex++;
|
||||||
|
startTransitionAnimation();
|
||||||
|
} else {
|
||||||
|
state = TRANSITION_NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Рисуем подкладку
|
||||||
|
Drawable d = getDrawable(fromIndex);
|
||||||
|
d.draw(canvas);
|
||||||
|
|
||||||
|
// Рисуем наложенное изображение с прозрачностью
|
||||||
|
if (alpha > 0) {
|
||||||
|
d = getDrawable(toIndex);
|
||||||
|
d.setAlpha(alpha);
|
||||||
|
d.draw(canvas);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!done) invalidateSelf();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Builder {
|
||||||
|
|
||||||
|
private static final Drawable NONE = new ColorDrawable();
|
||||||
|
|
||||||
|
private int fullDuration;
|
||||||
|
private final List<Integer> durations;
|
||||||
|
private final List<Drawable> drawables;
|
||||||
|
|
||||||
|
public Builder() {
|
||||||
|
fullDuration = 0;
|
||||||
|
this.durations = new ArrayList<Integer>();
|
||||||
|
this.drawables = new ArrayList<Drawable>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder add(int duration, Drawable drawable) {
|
||||||
|
fullDuration += duration;
|
||||||
|
durations.add(duration);
|
||||||
|
drawables.add(drawable == null ? NONE : drawable);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TransitionAnimationDrawable build() {
|
||||||
|
final int size = durations.size();
|
||||||
|
final int[] durationsArray = new int[size];
|
||||||
|
final Drawable[] drawablesArray = new Drawable[size];
|
||||||
|
for (int i = 0; i < size; i++) {
|
||||||
|
durationsArray[i] = durations.get(i);
|
||||||
|
drawablesArray[i] = drawables.get(i);
|
||||||
|
}
|
||||||
|
return new TransitionAnimationDrawable(fullDuration, durationsArray, drawablesArray);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user