使用Timer和Canvas制作动画效果(转)

本例演示了如何使用Canvas和Timer来制作动画效果,可以使用Guage来调节帧速率和动画精灵的个数。程序结构清晰,是不错的参考案例。

200672585128689.gif200672585128883.gif

/*
* AnimationMIDlet.java
*
* Created on 2005年12月2日, 上午10:50
*/

package com.j2medev.animation;

import java.util.Timer;
import java.util.TimerTask;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;

public class AnimationMIDlet extends MIDlet implements CommandListener, ItemStateListener {

// The MIDlet's Display object
private Display display;
// Flag indicating first call of startApp
protected boolean started;
// Exit command
private Command exitCommand;
// Setup command
private Command setupCommand;
// Run command
private Command runCommand;
// Configuration form
private Form form;
// Animation canvas
private AnimationCanvas canvas;
// Gauge for block count
private Gauge blockGauge;
// Gauge for frame rate
private Gauge rateGauge;
// Initial frame rate
private static final int FRAME_RATE = 1;
// Initial number of blocks
private static final int BLOCK_COUNT = 1;

protected void startApp() {
if (!started) {
display = Display.getDisplay(this);
form = new Form("Animation");
rateGauge = new Gauge("Frame rate", true, 10, FRAME_RATE);
blockGauge = new Gauge("Blocks", true, 4, BLOCK_COUNT);
form.append(rateGauge);
form.append(blockGauge);
form.setItemStateListener(this);
canvas = createAnimationCanvas();
exitCommand = new Command("Exit", Command.EXIT, 0);
setupCommand = new Command("Setup", Command.SCREEN, 0);
runCommand = new Command("Run", Command.SCREEN, 0);
canvas.addCommand(exitCommand);
canvas.addCommand(setupCommand);
form.addCommand(exitCommand);
form.addCommand(runCommand);
form.setCommandListener(this);
canvas.setCommandListener(this);
display.setCurrent(form);
started = true;
}
}

protected void pauseApp() {
}

protected void destroyApp(boolean unconditional) {
}

public void commandAction(Command c, Displayable d) {
if (c == exitCommand) {
notifyDestroyed();
} else if (c == runCommand) {
display.setCurrent(canvas);
} else if (c == setupCommand) {
display.setCurrent(form);
}
}
public void itemStateChanged(Item item) {
if (item == blockGauge) {
int count = blockGauge.getValue();
if (count < 1) {
count = 1;
}
canvas.setBlockCount(count);
} else if (item == rateGauge) {
int count = rateGauge.getValue();
if (count < 1) {
count = 1;
}
canvas.setFrameRate(count);
}
}
// Creates the canvas that will draw the block
protected AnimationCanvas createAnimationCanvas() {
return new AnimationCanvas();
}
class AnimationCanvas extends Canvas {

// Size of each block
protected static final int SIZE = 6;
// Initial speeds in the X direction
protected final int[] xSpeeds = { 2, -2, 0, -2 };
// Initial speeds in the Y direction
protected final int[] ySpeeds = { 2, -2, 2, -0 };
// Background color
protected int background = display.isColor() ? 0xff0ff0 : 0xc0c0c0;
// Foreground color
protected int foreground = display.isColor() ? 0xfff000 : 0;
// Width of screen
protected int width = getWidth();
// Height of screen
protected int height = getHeight();
// The screen update rate
protected int frameRate;
// The blocks to draw on the screen
protected Block[] blocks;
// The update timer
protected Timer timer;
// The update timer task
protected TimerTask updateTask;
// Gets the maximum number of blocks
public int getMaxBlocks() {
return blocks.length;
}
// Constructs a canvas with default settings
AnimationCanvas() {
setBlockCount(BLOCK_COUNT);
setFrameRate(FRAME_RATE);
}
// Sets the number of blocks to draw
public void setBlockCount(int count) {
if (count > xSpeeds.length) {
throw new IllegalArgumentException("Cannot have more than "
+ xSpeeds.length + " blocks");
}
blocks = new Block[count];
createBlocks();
}
// Gets the number of blocks to draw
public int getBlockCount() {
return blocks.length;
}
// Sets the number of updates per second
public void setFrameRate(int frameRate) {
if (frameRate < 1 || frameRate > 10) {
throw new IllegalArgumentException("Frame rate must be > 0 and <= 10");
}
this.frameRate = frameRate;
if (isShown()) {
startFrameTimer();
}
}
// Gets the number of updates per second
public int getFrameRate() {
return frameRate;
}
// Paint canvas background and all
// of the blocks in their correct locations.
protected void paint(Graphics g) {
// Paint with the background color
g.setColor(background);
g.fillRect(0, 0, width, height);
// Draw all of the blocks
g.setColor(foreground);
synchronized (this) {
for (int i = 0, count = blocks.length; i < count; i++) {
g.fillRect(blocks[i].x, blocks[i].y, SIZE, SIZE);
}
}
}
// Notification that the canvas has been made visible
protected void showNotify() {
// Start the frame timer running
startFrameTimer();
}
// Notification that the can


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10294527/viewspace-127161/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10294527/viewspace-127161/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值