diff options
author | Chris Craik <ccraik@google.com> | 2014-01-13 19:37:04 -0800 |
---|---|---|
committer | Chris Craik <ccraik@google.com> | 2014-01-14 12:14:16 -0800 |
commit | e36c5d675c8c2f900ef186a55edf71ce36ca9fa0 (patch) | |
tree | 7316be06e3fc377a1ce73672d88d8aeef2fc4ebd /framesequence/src/android/support/rastermill/FrameSequenceDrawable.java | |
parent | 335482c41b2ac3b66da2e207b47306fb53f4b174 (diff) | |
download | android_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.java | 71 |
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(); } } |