用J2ME在移动设备上实现动画 |
| 作者:未知 来源:JSP中文网 发布时间:2005-7-8 15:08:49 |
|
= new Timer(); AnimatedImage ai = ..... // get the image timer.schedule( ai, 200, 200 ); 每隔大约200毫秒,timer调用AnimatedImage.run()方法一次,这个方法使得动画翻滚到下一个帧。现在我们需要的是让MIDlet 来试试显示动画!我们定义一个简单的Canvas类的子类,好让我们把动画“粘贴上去”。 import java.util.*; import javax.microedition.lcdui.*; // A canvas to which you can attach one or more // animated images. When the canvas is painted, // it cycles through the animated images and asks // them to paint their current image. public class AnimatedCanvas extends Canvas {; private Display display; private Image offscreen; private Vector images = new Vector(); public AnimatedCanvas( Display display ){; this.display = display; // If the canvas is not double buffered by the // system, do it ourselves... if( !isDoubleBuffered() ){; offscreen = Image.createImage( getWidth(), getHeight() ); }; }; // Add an animated image to the list. public void add( AnimatedImage image ){; images.addElement( image ); }; // Paint the canvas by erasing the screen and then // painting each animated image in turn. Double // buffering is used to reduce flicker. protected void paint( Graphics g ){; Graphics saved = g; if( offscreen != null ){; g = offscreen.getGraphics(); }; g.setColor( 255, 255, 255 ); g.fillRect( 0, 0, getWidth(), getHeight() ); int n = images.size(); for( int i = 0; i < n; ++i ){; AnimatedImage img = (AnimatedImage) images.elementAt( i ); img.draw( g ); }; if( g != saved ){; saved.drawImage( offscreen, 0, 0, Graphics.LEFT | Graphics.TOP ); }; }; }; AnimatedCanvas 类的代码相当简单,由一个动画导入方法和一个paint方法。canvas画布每次被画,背景都会被擦除 然后循环每个导入的AnimatedImage对象,直接画到自己身上来(自己扩展了canvas类)。 import java.io.*; import java.util.*; import javax.microedition.lcdui.*; import javax.microedition.midlet.*; // MIDlet that displays some simple animations. // Displays a series of birds on the screen and // animates them at different (random) rates. public class AnimationTest extends MIDlet implements CommandListener {; private static final int BIRD_FRAMES = 7; private static final int NUM_BIRDS = 5; private Display display; private Timer timer = new Timer(); private AnimatedImage[] birds; private Random random = new Random(); public static final Command exitCommand = new Command( "Exit", Command.EXIT, 1 ); public AnimationTest(){; }; public void commandAction( Command c, Displayable d ){; if( c == exitCommand ){; exitMIDlet(); }; }; protected void destroyApp( boolean unconditional ) throws MIDletStateChangeException {; exitMIDlet(); }; public void exitMIDlet(){; timer.cancel(); // turn it off... notifyDestroyed(); }; // Generate a non-negative random number... private int genRandom( int upper ){; return( Math.abs( random.nextInt() ) % upper ); }; public Display getDisplay(){; return display; }; // Initialize things by creating the canvas and then // creating a series of birds that are moved to // random locations on the canvas and attached to // a timer for scheduling. protected void initMIDlet(){; try {; AnimatedCanvas c = new AnimatedCanvas( getDisplay() ); Image[] images = loadFrames( "/images/bird", BIRD_FRAMES ); int w = c.getWidth(); int h = c.getHeight(); birds = new AnimatedImage[ NUM_BIRDS ]; for( int i = 0; i < NUM_BIRDS; ++i ){; AnimatedImage b = new AnimatedImage( c, images ); birds = b; b.move( genRandom( w ), genRandom( h ) ); c.add( b ); timer.schedule( b, genRandom( 1000 ), genRandom( 400 ) ); }; c.addCommand( exitCommand ); c.setCommandListener( this ); getDisplay().setCurrent( c ); }; catch( IOException e ){; System.out.println( "Could not load images" ); exitMIDlet(); }; }; // Load the bird animation, which is stored as a // series of PNG files in the MIDlet suite. private Image[] loadFrames( String name, int frames ) throws IOException {; Image[] images = new Image[frames]; for( int i = 0; i < frames; ++i ){; images = Image.createImage( name + i + ".png" ); }; return images; }; protected void pauseApp(){; }; protected void startApp() throws MIDletStateChangeException {; if( display == null ){; display = Display.getDisplay( this ); initMIDlet(); }; }; }; 七帧图片的动画,你可以看到一个拍着翅膀的小鸟。MIDlet显示了5只小鸟,小鸟的位置和刷新速度是随机的。 你可以用一些其他的办法来改进这个程序,但这个程序也应该足够能让你上手了。 |
| [] [返回上一页] [打 印] |
|
文章评论 |
