Beginning Java 2- JDK 1.3 Version Images and Animation
The thread code itself will be very similar to the previous example – the
timing mechanism is exactly the same. We now need to increment the rotation
angle in each time interval so it will be much simpler:
// This method is called when the animation thread is started
public void run()
{
long time = System.currentTimeMillis(); // Starting time
// Move image while whirling is true
while(whirling)
{
imagePanel.repaint(); // Repaint the image
// Wait until the end of the interval
try
{
time += INTERVAL; // Increment the time
angle = 2.0*Math.PI*stepCount++/ STEPS_PER_ROTATION;
stepCount %= STEPS_PER_ROTATION;
Thread.sleep(Math.max(0, time -
System.currentTimeMillis()));
}
catch (InterruptedException e)
{
break;
}
}
}
[Lines 17 and 18 above are one line. They have been split for formatting
purposes.]
The stepCount variable starts at 0 and is incremented by 1 on
each iteration of the loop. Since a complete rotation through 2 radians
should occur after STEPS_PER_ROTATION steps, after
stepCount steps the rotation angle is the result of the
expression2.0*Math.PI*stepCount/STEPS_PER_ROTATION. In the
statement calculating the rotation angle we also increment
stepCount using the postfix increment operator. The image
returns to its original position after STEPS_PER_ROTATION
steps, so we maintain the value of stepCount modulo
STEPS_PER_ROTATION.
The last bit we need to complete the applet is the ImagePanel
class, and this only differs from the previous example in the
implementation of the paint() method:
class ImagePanel extends JPanel
{
public ImagePanel(Image image)
{
this.image = image;
}
public void paint(Graphics g)
{
Graphics2D g2D = (Graphics2D)g;
g2D.transform(at); // Apply scale & translate
g2D.setPaint(Color.lightGray);
g2D.fillRect(0, 0, imageWidth, imageHeight);
g2D.rotate(angle, imageWidth/2.0, imageHeight/2.0); // Rotate about center
// draw scaled imaged with background
g2D.drawImage(image, 0, 0, this);
}
Image image; // The image
}
That's the complete applet so give it a whirl. It would be a good idea to
make the applet dimension larger in the html file – 200x200 say – then you
can see the image more clearly. The downside to a larger applet is that it
will take more processor time since there are more pixels to process.
How It Works
The basic principles are the same as in the previous example. The thread
code in the run() method repaints the imagePanel
object every interval milliseconds. The while
loop that expedites this increments angle each time, and
angle defines the rotation transformation that is applied in
the paint() method for the imagePanel object.
We define the rotation with the statement:
g2D.rotate(angle, imageWidth/2.0, imageHeight/2.0);
// Rotate about center
The transformation specified by this version of the rotate()
method is concatenated with the existing transform for the graphics
context, which is the AffineTransform object that we create in
the init() method for the applet. The transform created by
this rotate() call is a composite of a translation to the
center of the image, the coordinates of which are defined by the last two
arguments, a rotation through angle radians – supplied as the
first argument, then a translation back to the original origin point. Thus
the rotation is about the center of the image.
New on the Java Boutique:
New Review:
Time Management Made Easy with the Quartz Enterprise Job Scheduler
Why not just use the Java timer API? This open source scheduling
API boasts simplicity, ease-of-integration, a well-rounded feature
set, and it's free!
New Applet:
Reverse Complement
Reverse Complement is a simple applet that converts DNA or RNA
sequences into three useful formats.
Elsewhere on internet.com:
WebDeveloper Java
Lots of Java information on webdeveloper.com
WDVL Java
Thorough Java resource at the Web Developer's Virtual Library.
ScriptSearch Java
Hundreds of free Java code files to download.
jGuru: Your View of the Java Universe
Customizable portal with online training, FAQs, regular news updates, and tutorials.
|