Animation.java Source code

Java tutorial

Introduction

Here is the source code for Animation.java

Source

/*--------------------------------------------------
* Animation.java
*
* Demonstrate simple animation using
* a Timer and TimerTask
*
* Example from the book:     Core J2ME Technology
* Copyright John W. Muchow   http://www.CoreJ2ME.com
* You may use/modify for any non-commercial purpose
*-------------------------------------------------*/
import java.util.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class Animation extends MIDlet {
    private Display display; // The display
    private AnimationCanvas canvas; // Canvas 
    private Timer tm; // Timer
    private AnimateTimerTask tt; // Task

    public Animation() {
        display = Display.getDisplay(this);
        canvas = new AnimationCanvas(this);

        // Create task that fires off every 1/10 second    
        tm = new Timer();
        tt = new AnimateTimerTask(canvas);
        tm.schedule(tt, 0, 100);
    }

    protected void startApp() {
        display.setCurrent(canvas);
    }

    protected void pauseApp() {
    }

    protected void destroyApp(boolean unconditional) {
    }

    public void exitMIDlet() {
        destroyApp(true);
        notifyDestroyed();
    }
}

/*--------------------------------------------------
* AnimateTimerTask.java
*
* Change location of bouncing ball on the canvas
*
* Example from the book:     Core J2ME Technology
* Copyright John W. Muchow   http://www.CoreJ2ME.com
* You may use/modify for any non-commercial purpose
*-------------------------------------------------*/

class AnimateTimerTask extends TimerTask {
    private AnimationCanvas canvas;

    public AnimateTimerTask(AnimationCanvas canvas) {
        this.canvas = canvas;
    }

    /*--------------------------------------------------
    * Determine next location of the ball.
    * If the ball reaches any edge, change the color
    * Track how many times we've switced directions
    *-------------------------------------------------*/
    public final void run() {
        // If past the right edge or prior to left edge...
        if ((canvas.x_loc + canvas.radius + canvas.x_dir > canvas.getWidth())
                || (canvas.x_loc - canvas.radius + canvas.x_dir < 0)) {
            canvas.x_dir = -canvas.x_dir;
            canvas.changeColor();
            canvas.directionChanged++;
        }

        // If past the bottom or before the top...
        if ((canvas.y_loc + canvas.radius + canvas.y_dir > canvas.getHeight())
                || (canvas.y_loc - canvas.radius + canvas.y_dir < 0)) {
            canvas.y_dir = -canvas.y_dir;
            canvas.changeColor();
            canvas.directionChanged++;
        }

        // Update the new x and y locations
        canvas.x_loc += canvas.x_dir;
        canvas.y_loc += canvas.y_dir;

        canvas.repaint();
    }
}

/*--------------------------------------------------
* AnimationCanvas.java
*
* Show a ball that bounces around on a canvas 
* Each time we hit a wall we change the ball color
* We also clear the screen after 'n' number of
* hits against the wall
* The "left" and "right" keys change the ball size
* The "Fire" key resets the display, however,
* it leaves the ball size the same.
*
* Example from the book:     Core J2ME Technology
* Copyright John W. Muchow   http://www.CoreJ2ME.com
* You may use/modify for any non-commercial purpose
*-------------------------------------------------*/

class AnimationCanvas extends Canvas implements CommandListener {
    private Animation midlet; // Main midlet
    private Command cmExit; // Exit midlet
    private int keyFire, // Reset ball            
            keyRight, // Increase ball radius
            keyLeft; // Decrease ball radius
    private boolean clearBackground = false; // Clear background
    private Random random; // Random number
    int x_loc, // Current x & y locations
            y_loc, radius, // Ball radius
            red, // rgb colors
            green, blue, x_dir, // Next x & y positions of ball
            y_dir, start_x, // Where ball starts 
            start_y, directionChanged = 0; // How many times we've hit a wall
    private static final int MAX_CHANGES = 50;

    /*--------------------------------------------------
    * Constructor
    *-------------------------------------------------*/
    public AnimationCanvas(Animation midlet) {
        // Save reference to main midlet
        this.midlet = midlet;

        random = new java.util.Random();

        // Determine starting location and direction of ball
        init();
        radius = 7;

        // Create exit command and "Fire" key
        cmExit = new Command("Exit", Command.EXIT, 1);

        keyFire = getKeyCode(FIRE);
        keyRight = getKeyCode(RIGHT);
        keyLeft = getKeyCode(LEFT);

        addCommand(cmExit);
        setCommandListener(this);
    }

    /*--------------------------------------------------
    * Paint a new ball, clearing the screen as asked
    *-------------------------------------------------*/
    protected void paint(Graphics g) {
        // Max edge hits, reset everything
        if (directionChanged > MAX_CHANGES)
            init();

        // Clear the background
        if (clearBackground) {
            g.setColor(255, 255, 255);
            g.fillRect(0, 0, getWidth(), getHeight());
            clearBackground = !clearBackground;
        }

        // Set color and draw another ball
        g.setColor(red, green, blue);
        g.fillArc(x_loc, y_loc, radius, radius, 0, 360);
    }

    /*--------------------------------------------------
    * Initialize starting location and direction of ball
    *-------------------------------------------------*/
    private void init() {
        // Start close to the middle
        x_loc = getWidth() / 2;
        y_loc = getHeight() / 2;

        // The direction the ball is heading
        x_dir = (random.nextInt() % 10);
        if (x_dir == 0)
            x_dir = 1;

        y_dir = (random.nextInt() % 10);
        if (y_dir == 0)
            y_dir = 1;

        directionChanged = 0;
        clearBackground = true;
        changeColor();
    }

    /*--------------------------------------------------
    * Change the colors.
    * I am counting on the implemention to substitute
    * a use-able color if any of these are out of the 
    * devices supported range
    *-------------------------------------------------*/
    protected void changeColor() {
        // The shift is to remove any sign (negative) bit    
        red = (random.nextInt() >>> 1) % 256;
        green = (random.nextInt() >>> 1) % 256;
        blue = (random.nextInt() >>> 1) % 256;
    }

    /*--------------------------------------------------
    * Event handling
    *-------------------------------------------------*/
    public void commandAction(Command c, Displayable d) {
        if (c == cmExit)
            midlet.exitMIDlet();
    }

    /*--------------------------------------------------
    * Reset ball is "Fire" key is pressed
    *-------------------------------------------------*/
    protected void keyPressed(int keyCode) {
        // Restart
        if (keyCode == keyFire)
            init();
        // Decrease ball size
        else if (keyCode == keyLeft)
            radius = Math.max(1, --radius);
        else if (keyCode == keyRight)
            // Increase ball size
            radius = Math.min(getWidth() / 4, ++radius);
    }
}