Animation in Java

slimwhimperΛογισμικό & κατασκευή λογ/κού

3 Νοε 2013 (πριν από 3 χρόνια και 10 μήνες)

54 εμφανίσεις

Animation in Java

behumble@hanjava.net

D
isclaimer

Rendering

or
Performance

issues
are
not

covered here


Simplest Example

Using Timer

2 Timers in Java World


java.util.Timer


for general use


calls
java.util.TimerTask
instance


good for scheduling tasks


specifying time for task


javax.swing.Timer


GUI specific


calls
java.awt.event.ActionListener

instance


called on EDT

Working Implementation


Example1

labelPanel.getObj()

Code & Demo of Example 1

timer = new Timer(10, new ActionListener() {


public void actionPerformed(ActionEvent e) {


if(xPos < xEndPos) {


xPos += xDiff;


JComponent obj = labelPanel.getObject();


obj.setLocation( xPos, obj.getY() );


} else {


timer.stop();


xPos = 0;


}


}

});

timer.start();

Is it enough?


What about


Repetition


Duration


On slow machine


Non
-
linear interpolation


Reverse direction


Back and Forth

Time based animation

v = f(t)

Key Concepts of Timing Model


Cycle


Smallest unit for animation


Envelope


container of same cycles


TimingController


uses Cycles & Envelopes


Synthesize
TimingEvent
(s)


TimingTarget


Interface we should implements


Modify value based on timing event

Cycle

Envelope

Envelope ( bonus )


Repeat Behavior


FORWARD

or
REVERSE


at the end of each cycles


End Behavior


HOLD

or
RESET


at the end of the Envelope

Timing Target


Interface we should implement


callback for timing events


where the formula (
v=f(t)
) resides

Example 2

// duration : 1s
,
resolution : 10 ms

Cycle horizontalCycle = new Cycle( 1000, 10 );

// repeat 5 times
,

beginning delay : 0 ms

Envelope simpleEnv = new Envelope( 5, 0,
Envelope.RepeatBehavior.FORWARD,
Envelope.EndBehavior.HOLD );

TimingTarget tt = new TimingTarget()

{


public void begin() {}


public void end() {}


public void timingEvent(long cycleElapsedTime, long
totalElapsedTime, float fraction) {



int x = (int)(fraction * 400);


JComponent obj = labelPanel.getObject();


obj.setLocation( x, obj.getY() );


}

};


TimingController controller = new TimingController(
horizontalCycle, simpleEnv );

controller.addTarget( tt );

controller.start();

Demo of Example 2


Duration


Resolution


Beginning delay


Repeat Count


Repeat Behavior

Hardcore
Animation

Non
-
linear Interpolation


Real World is non
-
linear


Gravity, Acceleration, friction…


Non
-
linear movement looks more natural


see
KeySplines
,
KeyFrames

Ease
-
in

Ease
-
in, Ease
-
out

Quick Start

Acceleration / Deceleration


Simple & useful non
-
linear interpolation


Float value between 0 and 1


Fraction of time spent speeding up or
slowing down


Demo please


modifying Example 2

Property Setter


Property

is CBD term for field or
member variable


Animate property of JavaBeans


Consists of


PropertyRange


property name + value range


int, double, float, Dimension, Point, Color,
Rectangle


Object modifier


implements TimingTarget

Example 3 & Demo

Cycle horizontalCycle = new Cycle( 1000, 10 );

Envelope simpleEnv = new Envelope( 1, 0,
RepeatBehavior.REVERSE, EndBehavior.HOLD );


Rectangle from = new Rectangle( 0, 0, 0, 0 );

Rectangle to = new Rectangle( 100, 100, 200, 200 );



PropertyRange boundsRange =
PropertyRange.createPropertyRangeRectangle("bounds",
from, to);

TimingTarget tt = new ObjectModifier(
labelPanel.getObject(), boundsRange );



TimingController controller = new TimingController(
horizontalCycle, simpleEnv );

controller.addTarget( tt );

controller.start();

Trigger


Utilities to reduce event listener code


Useful for


Hover effect for buttons


Pulsating effect for focus events


Animation on action events


ActionTrigger, ButtonStateTrigger,
ComponentFocusTrigger, TimingTrigger


Trigger Example

from JavaOne2006 TS
-
1297 Slide

Multi
-
Step Animations

KeyValues, KeyTimes, KeySplines, KeyFrames (Example 4)

Cycle horizontalCycle = new Cycle( 1000, 10 );

Envelope simpleEnv = new Envelope( 1, 0, REVERSE, HOLD );


Point from = new Point( 0, 10 );

Point mid = new Point ( 10, 300 );

Point to = new Point( 400, 100 );

// variable length arguments

KeyValues values = KeyValues.createKeyValues(from, mid, to);

KeyFrames frames = new KeyFrames( values );

PropertyRange boundsRange = new PropertyRange("location",
frames );

TimingTarget tt = new ObjectModifier( labelPanel.getObject(),
boundsRange );



TimingController controller = new TimingController(
horizontalCycle, simpleEnv );

controller.addTarget( tt );

controller.start();

Application


Not only for location, size, bounds


can apply for everywhere


Example 5


Fading Animation Demo

Reference


Timing is Everything


http://today.java.net/pub/a/today/2005/02/15/ti
ming.htmlhttp://today.java.net/pub/a/today/20
05/02/15/timing.html


Time Again


http://today.java.net/pub/a/today/2006/03/16/ti
me
-
again.html


Timing Framework


http://timingframework.dev.java.net/


JavaOne 2006 TS
-
1297 “Filthy Rich
Clients: Animated Effects in Swing
Applications”