From 8f2ef8f2d70edcfa159195e2efd23f95ff1b5789 Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Mon, 13 Jun 2016 16:08:20 -0700 Subject: Mirror project https://code.google.com/archive/p/java-universal-tween-engine/source/default/source Bug: 28936996 Change-Id: I70de8efea08289e032149d6c84c064a252ce42c2 --- README.md | 119 +++ java/api/src/aurelienribon/tweenengine.gwt.xml | 4 + .../src/aurelienribon/tweenengine/BaseTween.java | 543 ++++++++++++ java/api/src/aurelienribon/tweenengine/Pool.java | 55 ++ .../src/aurelienribon/tweenengine/Timeline.java | 363 ++++++++ java/api/src/aurelienribon/tweenengine/Tween.java | 923 +++++++++++++++++++++ .../aurelienribon/tweenengine/TweenAccessor.java | 82 ++ .../aurelienribon/tweenengine/TweenCallback.java | 45 + .../aurelienribon/tweenengine/TweenEquation.java | 28 + .../aurelienribon/tweenengine/TweenEquations.java | 52 ++ .../aurelienribon/tweenengine/TweenManager.java | 237 ++++++ .../src/aurelienribon/tweenengine/TweenPath.java | 22 + .../src/aurelienribon/tweenengine/TweenPaths.java | 14 + .../src/aurelienribon/tweenengine/TweenUtils.java | 53 ++ .../aurelienribon/tweenengine/equations/Back.java | 59 ++ .../tweenengine/equations/Bounce.java | 55 ++ .../aurelienribon/tweenengine/equations/Circ.java | 47 ++ .../aurelienribon/tweenengine/equations/Cubic.java | 47 ++ .../tweenengine/equations/Elastic.java | 86 ++ .../aurelienribon/tweenengine/equations/Expo.java | 49 ++ .../tweenengine/equations/Linear.java | 22 + .../aurelienribon/tweenengine/equations/Quad.java | 47 ++ .../aurelienribon/tweenengine/equations/Quart.java | 47 ++ .../aurelienribon/tweenengine/equations/Quint.java | 47 ++ .../aurelienribon/tweenengine/equations/Sine.java | 48 ++ .../tweenengine/paths/CatmullRom.java | 39 + .../aurelienribon/tweenengine/paths/Linear.java | 19 + .../tweenengine/primitives/MutableFloat.java | 34 + .../tweenengine/primitives/MutableInteger.java | 34 + .../aurelienribon/tweenengine/applets/Sprite.java | 74 ++ .../tweenengine/applets/SpriteAccessor.java | 43 + .../aurelienribon/tweenengine/applets/Theme.java | 75 ++ .../tweenengine/applets/TimelineApplet.form | 422 ++++++++++ .../tweenengine/applets/TimelineApplet.java | 623 ++++++++++++++ .../tweenengine/applets/TweenApplet.form | 392 +++++++++ .../tweenengine/applets/TweenApplet.java | 435 ++++++++++ .../tweenengine/applets/gfx/blankStrip.png | Bin 0 -> 1673 bytes .../tweenengine/applets/gfx/img-engine.png | Bin 0 -> 6589 bytes .../tweenengine/applets/gfx/img-logo.png | Bin 0 -> 4219 bytes .../tweenengine/applets/gfx/img-tween.png | Bin 0 -> 5638 bytes .../tweenengine/applets/gfx/img-universal.png | Bin 0 -> 4551 bytes .../tweenengine/applets/gfx/logo-timeline.png | Bin 0 -> 9813 bytes .../tweenengine/applets/gfx/logo-tween.png | Bin 0 -> 10111 bytes .../tweenengine/applets/gfx/transparent-dark.png | Bin 0 -> 172 bytes .../tweenengine/applets/gfx/transparent-light.png | Bin 0 -> 169 bytes .../aurelienribon/tweenengine/applets/gfx/vial.png | Bin 0 -> 6661 bytes .../aurelienribon/utils/swing/DrawingCanvas.java | 51 ++ .../src/aurelienribon/utils/swing/GroupBorder.java | 54 ++ .../src/aurelienribon/utils/swing/ImagePanel.java | 129 +++ .../src/aurelienribon/utils/swing/SwingHelper.java | 81 ++ java/applets/test-timeline.html | 9 + java/applets/test-tween.html | 9 + java/build.xml | 51 ++ 53 files changed, 5668 insertions(+) create mode 100755 README.md create mode 100755 java/api/src/aurelienribon/tweenengine.gwt.xml create mode 100755 java/api/src/aurelienribon/tweenengine/BaseTween.java create mode 100755 java/api/src/aurelienribon/tweenengine/Pool.java create mode 100755 java/api/src/aurelienribon/tweenengine/Timeline.java create mode 100755 java/api/src/aurelienribon/tweenengine/Tween.java create mode 100755 java/api/src/aurelienribon/tweenengine/TweenAccessor.java create mode 100755 java/api/src/aurelienribon/tweenengine/TweenCallback.java create mode 100755 java/api/src/aurelienribon/tweenengine/TweenEquation.java create mode 100755 java/api/src/aurelienribon/tweenengine/TweenEquations.java create mode 100755 java/api/src/aurelienribon/tweenengine/TweenManager.java create mode 100755 java/api/src/aurelienribon/tweenengine/TweenPath.java create mode 100755 java/api/src/aurelienribon/tweenengine/TweenPaths.java create mode 100755 java/api/src/aurelienribon/tweenengine/TweenUtils.java create mode 100755 java/api/src/aurelienribon/tweenengine/equations/Back.java create mode 100755 java/api/src/aurelienribon/tweenengine/equations/Bounce.java create mode 100755 java/api/src/aurelienribon/tweenengine/equations/Circ.java create mode 100755 java/api/src/aurelienribon/tweenengine/equations/Cubic.java create mode 100755 java/api/src/aurelienribon/tweenengine/equations/Elastic.java create mode 100755 java/api/src/aurelienribon/tweenengine/equations/Expo.java create mode 100755 java/api/src/aurelienribon/tweenengine/equations/Linear.java create mode 100755 java/api/src/aurelienribon/tweenengine/equations/Quad.java create mode 100755 java/api/src/aurelienribon/tweenengine/equations/Quart.java create mode 100755 java/api/src/aurelienribon/tweenengine/equations/Quint.java create mode 100755 java/api/src/aurelienribon/tweenengine/equations/Sine.java create mode 100755 java/api/src/aurelienribon/tweenengine/paths/CatmullRom.java create mode 100755 java/api/src/aurelienribon/tweenengine/paths/Linear.java create mode 100755 java/api/src/aurelienribon/tweenengine/primitives/MutableFloat.java create mode 100755 java/api/src/aurelienribon/tweenengine/primitives/MutableInteger.java create mode 100755 java/applets/src/aurelienribon/tweenengine/applets/Sprite.java create mode 100755 java/applets/src/aurelienribon/tweenengine/applets/SpriteAccessor.java create mode 100755 java/applets/src/aurelienribon/tweenengine/applets/Theme.java create mode 100755 java/applets/src/aurelienribon/tweenengine/applets/TimelineApplet.form create mode 100755 java/applets/src/aurelienribon/tweenengine/applets/TimelineApplet.java create mode 100755 java/applets/src/aurelienribon/tweenengine/applets/TweenApplet.form create mode 100755 java/applets/src/aurelienribon/tweenengine/applets/TweenApplet.java create mode 100755 java/applets/src/aurelienribon/tweenengine/applets/gfx/blankStrip.png create mode 100755 java/applets/src/aurelienribon/tweenengine/applets/gfx/img-engine.png create mode 100755 java/applets/src/aurelienribon/tweenengine/applets/gfx/img-logo.png create mode 100755 java/applets/src/aurelienribon/tweenengine/applets/gfx/img-tween.png create mode 100755 java/applets/src/aurelienribon/tweenengine/applets/gfx/img-universal.png create mode 100755 java/applets/src/aurelienribon/tweenengine/applets/gfx/logo-timeline.png create mode 100755 java/applets/src/aurelienribon/tweenengine/applets/gfx/logo-tween.png create mode 100755 java/applets/src/aurelienribon/tweenengine/applets/gfx/transparent-dark.png create mode 100755 java/applets/src/aurelienribon/tweenengine/applets/gfx/transparent-light.png create mode 100755 java/applets/src/aurelienribon/tweenengine/applets/gfx/vial.png create mode 100755 java/applets/src/aurelienribon/utils/swing/DrawingCanvas.java create mode 100755 java/applets/src/aurelienribon/utils/swing/GroupBorder.java create mode 100755 java/applets/src/aurelienribon/utils/swing/ImagePanel.java create mode 100755 java/applets/src/aurelienribon/utils/swing/SwingHelper.java create mode 100755 java/applets/test-timeline.html create mode 100755 java/applets/test-tween.html create mode 100755 java/build.xml diff --git a/README.md b/README.md new file mode 100755 index 0000000..bcbe519 --- /dev/null +++ b/README.md @@ -0,0 +1,119 @@ +![](http://www.aurelienribon.com/blog/wp-content/uploads/2012/05/tween-engine-big-logo.jpg) + +## Check out the demo! + + * [Android application](https://play.google.com/store/apps/details?id=aurelienribon.tweenengine.demo) + * [Desktop application](http://code.google.com/p/java-universal-tween-engine/downloads/detail?name=tween-engine-demo-6.3.0.zip) + * [WebGL html5 page](http://www.aurelienribon.com/universal-tween-engine/gwt/demo.html) (requires a WebGL enabled browser) + +## Introduction + +The Universal Tween Engine enables the interpolation of every attribute from any object in any Java project (being Swing, SWT, OpenGL or even Console-based). Implement the TweenAccessor interface, register it to the engine, and animate anything you want! + +In one line, send your objects to another position (here x=20 and y=30), with a smooth elastic transition, during 1 second). + +```java +// Arguments are (1) the target, (2) the type of interpolation, +// and (3) the duration in seconds. Additional methods specify +// the target values, and the easing function. + +Tween.to(mySprite, Type.POSITION_XY, 1.0f).target(20, 30).ease(Elastic.INOUT); + +// Possibilities are: + +Tween.to(...); // interpolates from the current values to the targets +Tween.from(...); // interpolates from the given values to the current ones +Tween.set(...); // apply the target values without animation (useful with a delay) +Tween.call(...); // calls a method (useful with a delay) + +// Current options are: + +myTween.delay(0.5f); +myTween.repeat(2, 0.5f); +myTween.repeatYoyo(2, 0.5f); +myTween.pause(); +myTween.resume(); +myTween.setCallback(callback); +myTween.setCallbackTriggers(flags); +myTween.setUserData(obj); + +// You can of course chain everything: + +Tween.to(...).delay(1.0f).repeat(2, 0.5f).start(myManager); + +// Moreover, slow-motion, fast-motion and reverse play is easy, +// you just need to change the speed of the update: + +myManager.update(delta * speed); +``` + +Create some powerful animation sequences! + +```java +Timeline.createSequence() + // First, set all objects to their initial positions + .push(Tween.set(...)) + .push(Tween.set(...)) + .push(Tween.set(...)) + + // Wait 1s + .pushPause(1.0f) + + // Move the objects around, one after the other + .push(Tween.to(...)) + .push(Tween.to(...)) + .push(Tween.to(...)) + + // Then, move the objects around at the same time + .beginParallel() + .push(Tween.to(...)) + .push(Tween.to(...)) + .push(Tween.to(...)) + .end() + + // And repeat the whole sequence 2 times + // with a 0.5s pause between each iteration + .repeatYoyo(2, 0.5f) + + // Let's go! + .start(myManager); +``` + +You can also quickly create timers: + +```java +Tween.call(myCallback).delay(3000).start(myManager); +``` + +Main features are: + + * Supports every interpolation function defined by [Robert Penner](http://www.robertpenner.com/easing/). + * Can be used with any object. You just have to implement the TweenAccessor interface when you want interpolation capacities. + * Every attribute can be interpolated. The only requirement is that what you want to interpolate can be represented as a float number. + * One line is sufficient to create and start a simple interpolation. + * Delays can be specified, to trigger the interpolation only after some time. + * Many callbacks can be specified (when tweens complete, start, end, etc.). + * Tweens and Timelines are pooled by default. If enabled, there won't be any object allocation during runtime! You can safely use it in Android game development without fearing the garbage collector. + * Tweens can be sequenced when used in Timelines. + * Tweens can act on more than one value at a time, so a single tween can change the whole position (X and Y) of a sprite for instance ! + * Tweens and Timelines can be repeated, with a yoyo style option. + * Simple timers can be built with Tween.call(). + * **Source code extensively documented!** + +## Get started and documentation index + +Detailed documentation with code snippets and examples is available for the following topics: + * Get started --- A step-by-step example to get you started, with code + + * The TweenAccessor interface --- Know how to implement it + * Tweens and options --- See what are the possibilities + * Timelines and options --- Learn how to build powerful sequences + * Animating Android apps --- See how to use the engine with Android UIs + +## Where can I ask for help? + +There is a dedicated forum for you: +http://www.aurelienribon.com/forum/viewforum.php?f=5 + +Also, the following link will guide you to a discussion thread that started it all: +http://www.badlogicgames.com/forum/viewtopic.php?f=17&t=494 \ No newline at end of file diff --git a/java/api/src/aurelienribon/tweenengine.gwt.xml b/java/api/src/aurelienribon/tweenengine.gwt.xml new file mode 100755 index 0000000..3b4e623 --- /dev/null +++ b/java/api/src/aurelienribon/tweenengine.gwt.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/java/api/src/aurelienribon/tweenengine/BaseTween.java b/java/api/src/aurelienribon/tweenengine/BaseTween.java new file mode 100755 index 0000000..d8cf0e6 --- /dev/null +++ b/java/api/src/aurelienribon/tweenengine/BaseTween.java @@ -0,0 +1,543 @@ +package aurelienribon.tweenengine; + +/** + * BaseTween is the base class of Tween and Timeline. It defines the + * iteration engine used to play animations for any number of times, and in + * any direction, at any speed. + *

+ * + * It is responsible for calling the different callbacks at the right moments, + * and for making sure that every callbacks are triggered, even if the update + * engine gets a big delta time at once. + * + * @see Tween + * @see Timeline + * @author Aurelien Ribon | http://www.aurelienribon.com/ + */ +public abstract class BaseTween { + // General + private int step; + private int repeatCnt; + private boolean isIterationStep; + private boolean isYoyo; + + // Timings + protected float delay; + protected float duration; + private float repeatDelay; + private float currentTime; + private float deltaTime; + private boolean isStarted; // true when the object is started + private boolean isInitialized; // true after the delay + private boolean isFinished; // true when all repetitions are done + private boolean isKilled; // true if kill() was called + private boolean isPaused; // true if pause() was called + + // Misc + private TweenCallback callback; + private int callbackTriggers; + private Object userData; + + // Package access + boolean isAutoRemoveEnabled; + boolean isAutoStartEnabled; + + // ------------------------------------------------------------------------- + + protected void reset() { + step = -2; + repeatCnt = 0; + isIterationStep = isYoyo = false; + + delay = duration = repeatDelay = currentTime = deltaTime = 0; + isStarted = isInitialized = isFinished = isKilled = isPaused = false; + + callback = null; + callbackTriggers = TweenCallback.COMPLETE; + userData = null; + + isAutoRemoveEnabled = isAutoStartEnabled = true; + } + + // ------------------------------------------------------------------------- + // Public API + // ------------------------------------------------------------------------- + + /** + * Builds and validates the object. Only needed if you want to finalize a + * tween or timeline without starting it, since a call to ".start()" also + * calls this method. + * + * @return The current object, for chaining instructions. + */ + public T build() { + return (T) this; + } + + /** + * Starts or restarts the object unmanaged. You will need to take care of + * its life-cycle. If you want the tween to be managed for you, use a + * {@link TweenManager}. + * + * @return The current object, for chaining instructions. + */ + public T start() { + build(); + currentTime = 0; + isStarted = true; + return (T) this; + } + + /** + * Convenience method to add an object to a manager. Its life-cycle will be + * handled for you. Relax and enjoy the animation. + * + * @return The current object, for chaining instructions. + */ + public T start(TweenManager manager) { + manager.add(this); + return (T) this; + } + + /** + * Adds a delay to the tween or timeline. + * + * @param delay A duration. + * @return The current object, for chaining instructions. + */ + public T delay(float delay) { + this.delay += delay; + return (T) this; + } + + /** + * Kills the tween or timeline. If you are using a TweenManager, this object + * will be removed automatically. + */ + public void kill() { + isKilled = true; + } + + /** + * Stops and resets the tween or timeline, and sends it to its pool, for ++ * later reuse. Note that if you use a {@link TweenManager}, this method ++ * is automatically called once the animation is finished. + */ + public void free() { + } + + /** + * Pauses the tween or timeline. Further update calls won't have any effect. + */ + public void pause() { + isPaused = true; + } + + /** + * Resumes the tween or timeline. Has no effect is it was no already paused. + */ + public void resume() { + isPaused = false; + } + + /** + * Repeats the tween or timeline for a given number of times. + * @param count The number of repetitions. For infinite repetition, + * use Tween.INFINITY, or a negative number. + * + * @param delay A delay between each iteration. + * @return The current tween or timeline, for chaining instructions. + */ + public T repeat(int count, float delay) { + if (isStarted) throw new RuntimeException("You can't change the repetitions of a tween or timeline once it is started"); + repeatCnt = count; + repeatDelay = delay >= 0 ? delay : 0; + isYoyo = false; + return (T) this; + } + + /** + * Repeats the tween or timeline for a given number of times. + * Every two iterations, it will be played backwards. + * + * @param count The number of repetitions. For infinite repetition, + * use Tween.INFINITY, or '-1'. + * @param delay A delay before each repetition. + * @return The current tween or timeline, for chaining instructions. + */ + public T repeatYoyo(int count, float delay) { + if (isStarted) throw new RuntimeException("You can't change the repetitions of a tween or timeline once it is started"); + repeatCnt = count; + repeatDelay = delay >= 0 ? delay : 0; + isYoyo = true; + return (T) this; + } + + /** + * Sets the callback. By default, it will be fired at the completion of the + * tween or timeline (event COMPLETE). If you want to change this behavior + * and add more triggers, use the {@link setCallbackTriggers()} method. + * + * @see TweenCallback + */ + public T setCallback(TweenCallback callback) { + this.callback = callback; + return (T) this; + } + + /** + * Changes the triggers of the callback. The available triggers, listed as + * members of the {@link TweenCallback} interface, are: + *

+ * + * BEGIN: right after the delay (if any)
+ * START: at each iteration beginning
+ * END: at each iteration ending, before the repeat delay
+ * COMPLETE: at last END event
+ * BACK_BEGIN: at the beginning of the first backward iteration
+ * BACK_START: at each backward iteration beginning, after the repeat delay
+ * BACK_END: at each backward iteration ending
+ * BACK_COMPLETE: at last BACK_END event + *

+ * + *

 {@code
+	 * forward :      BEGIN                                   COMPLETE
+	 * forward :      START    END      START    END      START    END
+	 * |--------------[XXXXXXXXXX]------[XXXXXXXXXX]------[XXXXXXXXXX]
+	 * backward:      bEND  bSTART      bEND  bSTART      bEND  bSTART
+	 * backward:      bCOMPLETE                                 bBEGIN
+	 * }
+ * + * @param flags one or more triggers, separated by the '|' operator. + * @see TweenCallback + */ + public T setCallbackTriggers(int flags) { + this.callbackTriggers = flags; + return (T) this; + } + + /** + * Attaches an object to this tween or timeline. It can be useful in order + * to retrieve some data from a TweenCallback. + * + * @param data Any kind of object. + * @return The current tween or timeline, for chaining instructions. + */ + public T setUserData(Object data) { + userData = data; + return (T) this; + } + + // ------------------------------------------------------------------------- + // Getters + // ------------------------------------------------------------------------- + + /** + * Gets the delay of the tween or timeline. Nothing will happen before + * this delay. + */ + public float getDelay() { + return delay; + } + + /** + * Gets the duration of a single iteration. + */ + public float getDuration() { + return duration; + } + + /** + * Gets the number of iterations that will be played. + */ + public int getRepeatCount() { + return repeatCnt; + } + + /** + * Gets the delay occuring between two iterations. + */ + public float getRepeatDelay() { + return repeatDelay; + } + + /** + * Returns the complete duration, including initial delay and repetitions. + * The formula is as follows: + *
+	 * fullDuration = delay + duration + (repeatDelay + duration) * repeatCnt
+	 * 
+ */ + public float getFullDuration() { + if (repeatCnt < 0) return -1; + return delay + duration + (repeatDelay + duration) * repeatCnt; + } + + /** + * Gets the attached data, or null if none. + */ + public Object getUserData() { + return userData; + } + + /** + * Gets the id of the current step. Values are as follows:
+ *