260 likes | 379 Views
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
E N D
Animation in Java behumble@hanjava.net
Disclaimer Rendering or Performance issues are not covered here
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
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 Property Range Non-linear Interpolation Acceleration Deceleration Trigger Object Modifier Multi-Step Animation
Ease-in Ease-in, Ease-out Quick Start Non-linear Interpolation • Real World is non-linear • Gravity, Acceleration, friction… • Non-linear movement looks more natural • see KeySplines, KeyFrames
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/timing.htmlhttp://today.java.net/pub/a/today/2005/02/15/timing.html • Time Again • http://today.java.net/pub/a/today/2006/03/16/time-again.html • Timing Framework • http://timingframework.dev.java.net/ • JavaOne 2006 TS-1297 “Filthy Rich Clients: Animated Effects in Swing Applications”