summaryrefslogtreecommitdiffstats
path: root/framesequence/src/android/support/rastermill/FrameSequenceDrawable.java
diff options
context:
space:
mode:
authorChris Craik <ccraik@google.com>2014-01-13 19:37:04 -0800
committerChris Craik <ccraik@google.com>2014-01-14 12:14:16 -0800
commite36c5d675c8c2f900ef186a55edf71ce36ca9fa0 (patch)
tree7316be06e3fc377a1ce73672d88d8aeef2fc4ebd /framesequence/src/android/support/rastermill/FrameSequenceDrawable.java
parent335482c41b2ac3b66da2e207b47306fb53f4b174 (diff)
downloadandroid_frameworks_ex-e36c5d675c8c2f900ef186a55edf71ce36ca9fa0.tar.gz
android_frameworks_ex-e36c5d675c8c2f900ef186a55edf71ce36ca9fa0.tar.bz2
android_frameworks_ex-e36c5d675c8c2f900ef186a55edf71ce36ca9fa0.zip
Add loop count control
-Adds callback into app for drawable that finishes animating -Fixes timestamp delay mapping (was previously off by one) -64 bit pointer storage Change-Id: I21cf7eb325fd58fb0aeda58f864d35fe483a89a7
Diffstat (limited to 'framesequence/src/android/support/rastermill/FrameSequenceDrawable.java')
-rw-r--r--framesequence/src/android/support/rastermill/FrameSequenceDrawable.java71
1 files changed, 70 insertions, 1 deletions
diff --git a/framesequence/src/android/support/rastermill/FrameSequenceDrawable.java b/framesequence/src/android/support/rastermill/FrameSequenceDrawable.java
index 94f4da0..f5f1f47 100644
--- a/framesequence/src/android/support/rastermill/FrameSequenceDrawable.java
+++ b/framesequence/src/android/support/rastermill/FrameSequenceDrawable.java
@@ -42,6 +42,49 @@ public class FrameSequenceDrawable extends Drawable implements Animatable, Runna
}
}
+ public static interface OnFinishedListener {
+ /**
+ * Called when a FrameSequenceDrawable has finished looping.
+ *
+ * Note that this is will not be called if the drawable is explicitly
+ * stopped, or marked invisible.
+ */
+ public abstract void onFinished(FrameSequenceDrawable drawable);
+ }
+
+ /**
+ * Register a callback to be invoked when a FrameSequenceDrawable finishes looping.
+ *
+ * @see setLoopBehavior()
+ */
+ public void setOnFinishedListener(OnFinishedListener onFinishedListener) {
+ mOnFinishedListener = onFinishedListener;
+ }
+
+ /**
+ * Loop only once.
+ */
+ public static final int LOOP_ONCE = 1;
+
+ /**
+ * Loop continuously. The OnFinishedListener will never be called.
+ */
+ public static final int LOOP_INF = 2;
+
+ /**
+ * Use loop count stored in source data, or LOOP_ONCE if not present.
+ */
+ public static final int LOOP_DEFAULT = 3;
+
+ /**
+ * Define looping behavior of frame sequence.
+ *
+ * Must be one of LOOP_ONCE, LOOP_INF, or LOOP_DEFAULT
+ */
+ public void setLoopBehavior(int loopBehavior) {
+ mLoopBehavior = loopBehavior;
+ }
+
private final FrameSequence mFrameSequence;
private final FrameSequence.State mFrameSequenceState;
@@ -60,9 +103,12 @@ public class FrameSequenceDrawable extends Drawable implements Animatable, Runna
private static final int STATE_READY_TO_SWAP = 4;
private int mState;
+ private int mCurrentLoop;
+ private int mLoopBehavior = LOOP_DEFAULT;
private long mLastSwap;
private int mNextFrameToDecode;
+ private OnFinishedListener mOnFinishedListener;
/**
* Runs on decoding thread, only modifies mBackBitmap's pixels
@@ -93,6 +139,14 @@ public class FrameSequenceDrawable extends Drawable implements Animatable, Runna
}
};
+ private Runnable mCallbackRunnable = new Runnable() {
+ @Override
+ public void run() {
+ if (mOnFinishedListener != null) {
+ mOnFinishedListener.onFinished(FrameSequenceDrawable.this);
+ }
+ }
+ };
public FrameSequenceDrawable(FrameSequence frameSequence) {
if (frameSequence == null) throw new IllegalArgumentException();
@@ -138,7 +192,21 @@ public class FrameSequenceDrawable extends Drawable implements Animatable, Runna
mFrontBitmap = tmp;
mLastSwap = SystemClock.uptimeMillis();
- scheduleDecodeLocked();
+
+ boolean continueLooping = true;
+ if (mNextFrameToDecode == mFrameSequence.getFrameCount() - 1) {
+ mCurrentLoop++;
+ if ((mLoopBehavior == LOOP_ONCE && mCurrentLoop == 1) ||
+ (mLoopBehavior == LOOP_DEFAULT && mCurrentLoop == mFrameSequence.getDefaultLoopCount())) {
+ continueLooping = false;
+ }
+ }
+
+ if (continueLooping) {
+ scheduleDecodeLocked();
+ } else {
+ scheduleSelf(mCallbackRunnable, 0);
+ }
}
}
@@ -166,6 +234,7 @@ public class FrameSequenceDrawable extends Drawable implements Animatable, Runna
if (!isRunning()) {
synchronized (mLock) {
if (mState == STATE_SCHEDULED) return; // already scheduled
+ mCurrentLoop = 0;
scheduleDecodeLocked();
}
}