用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文件里面加载图片: