Essential Java Animation Techniques: Timers, Cycles, and Non-linear Interpolation
260 likes | 388 Vues
Dive into Java animation with this comprehensive guide focusing on essential techniques. Learn how to use `java.util.Timer` and `javax.swing.Timer` for effective task scheduling. Explore the key concepts of cycling, timing models, and how to implement non-linear interpolation for more natural animations. Implement timing events using `TimingTarget` and create dynamic animations with ease while understanding the nuances of repeat behaviors and envelope settings. The guide includes clear code examples for practical implementation in your Java applications.
Essential Java Animation Techniques: Timers, Cycles, and Non-linear Interpolation
E N D
Presentation Transcript
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”