任何動(dòng)畫(huà)的最基本的前提,是要在足夠快的時(shí)間內(nèi)顯示和更換一張張的圖片,讓人的眼睛看到動(dòng)的畫(huà)面效果。圖片必須按照順序畫(huà)出來(lái)。從一張圖片到下一張圖片之間的變化越小,效果會(huì)越好。
首先要做的,是使用你的圖片處理軟件(比如ps或者firework)創(chuàng)建一系列相同大小的圖片來(lái)組成動(dòng)畫(huà)。每張圖片代表動(dòng)畫(huà)一幀。
你需要制作一定數(shù)量的禎--越多的幀會(huì)讓你的動(dòng)畫(huà)看上去越平滑。制作好的圖片一定要保存成PNG(Portable Network Graphics) 格式,MIDP唯一支持的圖片格式;(有兩個(gè)辦法讓你剛做好的圖片在MIDlet上變成動(dòng)畫(huà)。第一,把圖片都放到一個(gè)web服務(wù)器上,讓MIDlet下載他們,MIDP內(nèi)置的HTTP支持。第二個(gè)辦法更簡(jiǎn)單,把圖片用MIDlet打包成jar文件。如果你使用的是J2ME開(kāi)發(fā)工具,把PNG文件放在你的項(xiàng)目文件里面就可以了。
動(dòng)畫(huà)的過(guò)程其實(shí)更像帳本記錄:顯示當(dāng)前幀,然后適當(dāng)?shù)馗鼡Q到下一幀。那么使用一個(gè)類(lèi)來(lái)完成這個(gè)工作應(yīng)該是很恰當(dāng)?shù)模呛茫覀兙拖榷x一個(gè)AnimatedImage類(lèi):
import java.util.*;
import javax.microedition.lcdui.*;
// 定義了一個(gè)動(dòng)畫(huà),該動(dòng)畫(huà)其實(shí)只是一系列相同大小的圖片
// 輪流顯示,然后模擬出的動(dòng)畫(huà)
public class AnimatedImage extends TimerTask {;
private Canvas canvas;
private Image[] images;
private int[][] clipList;
private int current;
private int x;
private int y;
private int w;
private int h;
// Construct an animation with no canvas.
public AnimatedImage( Image[] images ){;
this( null, images, null );
};
// Construct an animation with a null clip list.
public AnimatedImage( Canvas canvas, Image[]
images ){; this( canvas, images, null );
};
// Construct an animation. The canvas can be null,
// but if not null then a repaint will be triggered
// on it each time the image changes due to a timer
// event. If a clip list is specified, the image is
// drawn multiple times, each time with a different
// clip rectangle, to simulate transparent parts.
public AnimatedImage( Canvas canvas, Image[] images,
int[][] clipList ){;
this.canvas = canvas;
this.images = images;
this.clipList = clipList;
if( images != null && clipList != null ){;
if( clipList.length < images.length ){;
throw new IllegalArgumentException();
};
};
if( images != null && images.length > 0 ){;
w = images[0].getWidth();
h = images[0].getHeight();
};
};
// Move to the next frame, wrapping if necessary.
public void advance( boolean repaint ){;
if( ++current >= images.length ){;
current = 0;
};
if( repaint && canvas != null && canvas.isShown()
){;
canvas.repaint( x, y, w, h );
canvas.serviceRepaints();
};
};
// Draw the current image in the animation. If
// no clip list, just a simple copy, otherwise
// set the clipping rectangle accordingly and
// draw the image multiple times.
public void draw( Graphics g ){;
if( w == 0 || h == 0 ) return;
int which = current;
if( clipList == null || clipList[which] == null
){;
g.drawImage( images[which], x, y,
g.TOP | g.LEFT );
}; else {;
int cx = g.getClipX();
int cy = g.getClipY();
int cw = g.getClipWidth();
int ch = g.getClipHeight();
int[] list = clipList[which];
for( int i = 0; i + 3 <= list.length; i +=
4 ){;
g.setClip( x + list[0], y + list[1],
list[2], list[3] );
g.drawImage( images[which], x, y,
g.TOP | g.LEFT );
};
g.setClip( cx, cy, cw, ch );
};
};
// Moves the animation's top left corner.
public void move( int x, int y ){;
this.x = x;
this.y = y;
};
// Invoked by the timer. Advances to the next frame
// and causes a repaint if a canvas is specified.
public void run(){;
if( w == 0 || h == 0 ) return;
advance( true );
};
};
只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。 | ||
![]() |
||
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問(wèn)
管理
|
||
相關(guān)文章:
|
||