用J2ME在移动设备上实现动画(转)

用J2ME在移动设备上实现动画(转)[@more@]

使用MIDP(移动信息设备概要文件)的开发人员经常会抱怨用些什么办法才可以在一个MIDlet上显示动画.MIDP 1.0没有直接提供对动画的支持(MIDP 2.0支持),但真要是自己去实现,其实也并非是一件很难的事。

任何动画的最基本的前提,是要在足够快的时间内显示和更换一张张的图片,让人的眼睛看到动的画面效果。图片必须按照顺序画出来。从一张图片到下一张图片之间的变化越小,效果会越好。

首先要做的,是使用你的图片处理软件(比如ps或者烟花)创建一系列相同大小的图片来组成动画。每张图片代表动画一帧。你需要制作一定数量的祯——越多的帧会让你的动画看上去越平滑。制作好的图片一定要保存成PNG(便携式网络图形)格式,MIDP唯一支持的图片格式。

有两个办法让你刚做好的图片在MIDlet上变成动画。第一,把图片都放到一个web服务器上,让MIDlet下载他们,MIDP内置的HTTP支持。第二个办法更简单,把图片用MIDlet打包成jar文件。如果你使用的是J2ME开发工具,把PNG文件放你的项目文件里面就可以了。

动画的过程其实更像帐本记录:显示当前帧,然后适当地更换到下一帧,那么使用一个类来完成这个工作应该是很恰当的,那好,我们就先定义一个AnimatedImage类:

进口java.util。*;

进口javax.microedition.lcdui。*;

//定义了一个动画,该动画其实只是一系列相同大小的图片

//轮流显示,然后模拟出的动画

公共类AnimatedImage延伸TimerTask {;

私人帆布画布;

私人形象[]图像;

私人int [] [] clipList;

私人int电流;私人int x

,

私人int y;私人int w

,

私人int h;

//构造一个动画没有帆布。

公共AnimatedImage(图片[]图像){;

(零、图像、零);

};

//构造一个空的剪辑动画列表。

公共AnimatedImage(帆布画布,图像[]图像)

{;

(帆布、图像、零);

};

//构造一个动画。画布可以为空,

//如果没有空重画就会被触发

//它每次形象变化由于计时器

//事件。如果指定一个夹列表,图片是

//多次,每次用不同的

//剪辑矩形,模拟透明部分。

公共AnimatedImage(帆布画布,形象[]图像,int [] [] clipList) {;

。帆布=帆布;

。图像=图像;

。clipList=clipList;

如果(图片!=null & & clipList !=null) {;

如果(clipList。长度<图像。长度){;

把新IllegalArgumentException ();

};

};

如果(图片!=null & &图片。长度> 0){;

w=图像[0].getWidth ();

h=图像[0].getHeight ();

};

};

//移动到下一个帧,如果需要包装。

公共空间推进(布尔重画){;

如果当前>=(+ +图像。长度){;目前

=0;

};

如果(重画& &画布!=null & & canvas.isShown ()) {;

画布。重画(x, y, w h);

canvas.serviceRepaints ();

};

};

//当前图像绘制的动画。如果

//不夹列表,只是一个简单的复制,否则

//设置相应剪切矩形和

//画图像多次。

公共空画(图形g) {;

如果(w==0 | | h==0)返回;

=当前int;

如果(clipList==null | | clipList[这]==null) {;

g。drawImage(图片[这],x, y,

g。| g。左);

};其他{;

int残雪=g.getClipX ();

int cy=g.getClipY ();

int cw=g.getClipWidth ();

int ch=g.getClipHeight ();

int []=clipList名单[这];

(int i=0;我+ 3 <=list.length;我+=4){;

g。setClip (x +列表[0]y +列表[1],[2],[3]列表),

g。drawImage(图片[这],x, y,

g。| g。左);

};

g。setClip (cx, cy、连续波、ch);

};

};

//移动animation´左上角。

公共空间移动(int x, int y) {;

。x=x;

。y=y;

};

//调用的计时器。进展到下一个帧

//,如果指定一个画布引起重画。

公共空运行(){;

如果(w==0 | | h==0)返回;

进步(真正);

};

};

你实例化一个AnimatedImage对象的时候你必须给AnimatedImage类的构造方法传一个图片对象数组,该数组代表动画的每一帧,使用的所有图片必须具有相同的高度和宽度。

用Image.createImage()方法从jar文件里面加载图片:

用J2ME在移动设备上实现动画(转)