当前位置:首页 > 日记 > 正文

J2ME在移动设备上的动画解决方案

J2ME在移动设备上的动画解决方案
开发者使用MIDP(移动信息设备描述)经常抱怨在midlet.midp 1显示动画的方式并没有提供直接支持的动画(MIDP 2的支持),但它是不是真的对自己做一件很难的事情。

任何动画的最基本前提是在足够快的时间内显示和替换图片,使人们能够看到运动画面的效果。

要做的第一件事是用你的图片处理(如PS或烟花)创造了一系列的相同尺寸的图像形成动画。每幅图代表一帧的动画,你需要一定数量的帧帧动画更会让你看起来更光滑,产生图片必须保存在PNG(便携式网络图形)格式和图像格式支持MIDP。

有两种方法可以让你刚刚做的成为动画在MIDlet的照片。首先,把所有的照片都放在网上,让MIDlet下载,MIDP的内置支持断点续传。二是更简单,和图片打包成jar文件的程序。如果您使用的是J2ME开发工具,把PNG文件在你的项目文件。

动画的过程其实更像本书记录:显示当前帧,然后到下一帧的相应的变化,所以它是适当的使用一个类来做到这一点,好吧,让我们先定义一个animatedimage类:

导入java。利用*;
进口javax.娘的*程序;
定义一个动画,动画实际上是一系列相同大小的动画。
然后进行动画显示。
公共课animatedimage延伸TimerTask {;
帆布帆布;
专用图像{ }图像;
{ } { } cliplist私有;
私人INT电流;
私有数组;
私有整数;
私人域名;
私有整数;

没有画布的动画。 /构建

市民AnimatedImage(图像{ }图片){;
此(NULL,图像,NULL);
};

用空/剪辑列表构建动画。

市民AnimatedImage(canvas画布,图像{ }图片)
{;
此(画布,图像,NULL);
};

构建动画。画布可以是空的,
但是,如果不为空则会触发/油漆
每次它都会由于计时器而改变图像。
如果剪辑列表是事件。指定的图像是
多次重复,每次使用不同的
来模拟/裁剪矩形,透明部分。

市民AnimatedImage(canvas画布,图像{ } { } { }图像,int cliplist){;
this.canvas =帆布;
this.images =图像;
this.cliplist = cliplist;

如果(图像)!= null cliplist!= NULL){;
如果(cliplist.length抛出时()();
};
};

如果(图像)!= null images.length > 0){;
W =图像{ 0 }。getWidth();
H =图像getHeight(){ 0 };
};
};

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

公共无效推进(布尔重画){;
如果(+当前=图像长度){;
电流=0;
};

如果(重画帆布!= null canvas.isshown()){;
Canvas.repaint(X,Y,W,H);
canvas.servicerepaints();
};
};

在动画中绘制当前图像。如果
只需要剪辑一个简单的副本,否则
相应地剪裁矩形并设置
图像多次。

公共空绘制(图形G){;
如果(W = 0 | | H = = 0)返回;
int =当前;
如果(cliplist = = null | | { cliplist { } = = null);
G.drawImage(图片{ },X,Y,
G.TOP g.LEFT |);
};其他{;
g.getclipx CX = int();
int cy = g.getclipy();
g.getclipwidth CW = int();
g.getclipheight CH = int();

int { } { } = cliplist列表;

为(int i = 0;我+ 3 g.setclip(X + Y +列表{ 0 },{ 1 }名单列表,列表{ 2 },{ 3 });
G.drawImage(图片{ },X,Y,
G.TOP g.LEFT |);
};

g.setclip(CX,CY,CW,CH);
};
};

动画的左上角。

公共无效移动(int x,int y){;
这个;
这个,y = y;
};

由计时器调用。前进到下一帧
造成重如果 /帆布指定。

公共空运行(){;
如果(W = 0 | | H = = 0)返回;
U3000
前进(正确);
};
};

当你实例化一个animatedimage对象,你必须传递图像对象的animatedimage类施工方法的数组,它代表每帧动画。所有的图片都必须使用相同的高度和宽度。

使用image.createimage()从JAR文件加载图像的方法:

私人形象{ } loadframes(String name,int帧)
抛出IOException {;
图像{ }图像=新图像{帧};
为(int i = 0;我的形象= image.createimage(姓名+我+PNG);
};
返回图像;
};

你也可以通过画布对象(可选),和剪辑列表(剪辑列表)。如果你指定一个画布,用定时器来自动换到下一帧的动画,如下面的示例代码,前滚后在动画自动重绘油画(重画)。但这一方法的实现是可选的,你可以做,也可以让程序选择合适的时间重绘油画。

因为MIDP 1不支持透明的图片。的animatedimage类使用剪辑列表对透明度的影响。剪辑列表是一系列的块状区域,图片裁剪。图片是分开几次当画画,每次画一个裁剪区域内夹列表。剪辑列表是在框架的基础上定义的,所以你需要创造画面的每一帧数组。数组的大小应该是4的倍数,因为每个剪辑区域保持四个值:左上坐标,坐标、宽度和高度,坐标原点是整张照片的左上角。需要注意的是,使用剪辑列表会缓慢的动画重要。如果画面比较复杂,你应该使用一个矢量图。

的animatedimage类扩展了java.util.timertask,允许你设置一个定时器。这里的一个例子,如何激活使用定时器:

定时器定时器=新定时器();
animatedimage AI =图像 / /得到.....
Timer.schedule(AI,200, 200);

每200毫秒定时器调用AnimatedImage.run()方法一次,使动画滚动到下一帧,现在我们需要的是有程序尝试显示动画!我们定义了一个简单的画布类的子类,这样我们就可以粘贴动画了。

导入java。利用*;
进口javax.娘的*程序;

一种可以附加一个或多个的画布。
动画图片。当画布被绘制时,
它通过动画图像循环/请求
描绘他们当前的形象。 /它们

公共课animatedcanvas延伸帆布{;
专用显示器;
私人后台图像;
私有向量图像=新向量();

公共animatedcanvas(显示){;
this.display =显示;

如果画布不是双/缓冲的
自己动手做…

如果(!isdoublebuffered()){;
画外= image.createimage(getWidth()),
GetHeight());
};
};

将动画图像添加到列表中。

公共无效添加(animatedimage图像){;
images.addelement(图像);
};

通过擦除屏幕来绘制画布,然后
依次绘制每个动画图像。双
用于减少闪烁。缓冲

保护空白油漆(图形G){;
图形保存= G;

如果(画外音!= NULL){;
G = offscreen.getgraphics();
};

(255, 255, 255)g.setcolor;
g.fillrect(0, 0,getWidth(),getHeight());

int n = images.size();
为(int i = 0;我animatedimage img =(animatedimage))
Images.elementAt(我);
img.draw(G);
};

如果(g)!=已保存){;
Saved.drawImage(画外,0, 0,
Graphics.LEFT Graphics.TOP |);
};
};
};

该animatedcanvas类的代码是很简单的,一个动画导入方法和涂料的方法。帆布帆布画一次,背景将被删除,然后每个周期的animatedimage对象直接向自己(他把画布类)。

导入java IO *;
导入java。利用*;
进口javax.娘的*程序;
进口javax.娘的MIDlet。*;

显示一些简单的动画。 / /程序
在屏幕上显示一系列的鸟
他们在 / /动画不同(随机)率。

公共课animationtest扩展MIDlet
实现了CommandListener {;

私有静态最后bird_frames = 7;
私有静态最后num_birds = 5;

专用显示器;
专用计时器=新定时器();
私人animatedimage { }鸟;
私有随机数=新随机数();

public static final的命令exitcommand =新的命令(退出
Public AnimationTest () {;};

public void commandAction(命令C,可显示D){;
如果(C = = exitcommand){;
ExitMIDlet();
};
};

protected void destroyapp(布尔条件)
把midletstatechangeexception {;
ExitMIDlet();
};

公共无效exitmidlet(){;
(定时器取消)…
notifydestroyed();
};

非负随机数…

私有genrandom(国际上){;
返回(math.abs(random.nextint())%上);
};

公共显示getDisplay(){ };显示;

通过创建画布来初始化事物,然后
创造一系列的鸟被移动到
画布上的随机位置和/附加到
调度计时器。

initmidlet protected void(){;
尝试{;
animatedcanvas C =新
AnimatedCanvas(getDisplay());
{ }图像图像= loadframes( / /鸟图片

W = c.getwidth int();
H = c.getheight int();

鸟=新animatedimage { num_birds };
为(int i = 0;我AnimatedImage B =新)
AnimatedImage(C,图像);
鸟=乙;
B.move(genrandom(W),genrandom(H));
C.add(B);
Timer.schedule(B,genrandom(1000),genrandom(400));
};

c.addcommand(exitcommand);
C.setCommandListener(本);

GetDisplay()SetCurrent(C);
};
赶上(IOException e){;
System.out.println(无法加载图像);
ExitMIDlet();
};
};

作为一个存储的
系列png文件在/ MIDlet套件。

私人形象{ } loadframes(String name,int帧)
抛出IOException {;
图像{ }图像=新图像{帧};
为(int i = 0;我的形象= image.createimage(姓名+我+PNG);
};

返回图像;
};

protected void pauseApp(){;};

protected void startApp()
把midletstatechangeexception {;
如果(显示= NULL){;
显示= display.getdisplay(本);
InitMIDlet();
};
};
};

七帧的动画,你可以用wings.midlet显示5鸟看鸟,和鸟的位置和速度是随机的。你可以用一些其他的方法来提高程序的,但它足以让你得到。

相关文章

ASP如何获得真正的IP地址

ASP如何获得真正的IP地址

地址,如何获得,电脑软件,ASP,IP,在ASP,我们用request.servervariables(remote_addr )获取客户端的IP地址,但如果客户端使用代理服务器来访问代理服务器的IP地址是不是真正的客户端IP地址,通过代理服务器获取客户端真实IP地址,request.servervaria…

Hakha123网址带我们去一个好的生活

Hakha123网址带我们去一个好的生活

网址,电脑软件,哈卡123网址导航,引导我们更好的生活! mdash;mdash;我们两词和那些事 作为世界趋势,长,长时间,事实上,无论是在生活中还是在政治和经济领域的感情,法律也时不时的跳出来措手不及,但值得庆幸的是,我们的年轻人,只要用心,生活其实可以很容…

关闭不需要的视觉效果更快Windows7

关闭不需要的视觉效果更快Windows7

不需要,更快,视觉效果,运行速度,电脑软件,Windows7和WindowsXP,为用户设置了很多的视觉效果来提高Windows系统的欣赏,但有些功能可以使用,它可以关闭。方法是:单击右键选择{ } { }计算机属性高级系统设置,点击左边{ }然后点击性能的{设置}按钮,留…

红星微博曝光360恶意用户关闭竞争

红星微博曝光360恶意用户关闭竞争

用户,红星,恶意,竞争,电脑软件,3月25日,经过两天的360借壳狙击,昨天经历的刘刚,腾讯的总经理,从腾讯发布的360次微博揭露的证据表明,360的用户故意误导他们的竞争对手的主动性。 雷克斯说360通过云修改了默认的禁用列表。 据了解,几天前,在北京…

视频网站期权价值曝光:优酷员工可以

视频网站期权价值曝光:优酷员工可以

期权,价值,购买,视频网站,首付,作为十大互联网流量在中国最顶尖的两个视频网站,土豆和优酷都上市,和互联网的财富效应的再活化。 土豆和优酷成立于2004和2005,本月还向纳斯达克和纽交所上市,并将在一个月内上市。 土豆内部的工作人员透露,公司…

迅雷已由eMule作为吸血驴密封

迅雷已由eMule作为吸血驴密封

密封,迅雷,吸血,已由,电脑软件,你会发现这个问题与迅雷资源有关。 现在霹雳的速度很慢。 在引进雷电中发现了许多新的资源。…

网络偷窥软件泛滥的互联网用户不要

网络偷窥软件泛滥的互联网用户不要

互联网,泛滥,用户,网络,相机,昨日,有网友在浏览网络远程监控软件的网站。张永博 网络偷窥成为目前人们热点关注的话题,在互联网上找到甚至一天记者:在线偷窥软件几乎到了疯狂的地步,卖几十元到几百元不等,有的甚至可以免费下载,而且很多都是出售…

在Windows7,禁止QQ等软件禁止运行QQ

在Windows7,禁止QQ等软件禁止运行QQ

运行,电脑软件,QQ,禁止QQ、游戏等软件在你的Windows7系统上运行,它可以通过修改组策略来解决,这是因为Windows XP一样。 运行gpedit.msc打开组策略编辑器,用户配置下,双击右不运行指定的Windows程序,然后选择使它在弹出的窗口中,点击显示一遍。…

李开复筹集了1亿美元成立了一家新

李开复筹集了1亿美元成立了一家新

风险,筹集,美元,投资公司,李开复,9月7日消息,李开复,谷歌大中国总裁,今天上午将宣布建立新的企业信息。据悉,新公司将是一个新的模型的企业类似于VC,旨在帮助年轻人创业。这种说法是相似的,从另一个源头了早期的腾讯技术新闻。 其实昨天,腾讯技术…

详细说明了18张身份证的标准,包括校

详细说明了18张身份证的标准,包括校

说明了,计算方法,身份证,标准,详细,18张身份证的标准如下: 1999年7月1日,国家质量技术监督局实施了18张身份证标准。 的GB11643-1999公民身份号码有明确规定。 gb11643-1989 GB11643-1999公民身份号码是社会保障 该号码的修订版本指出,原来的…

在UCDOS的五笔输入法移植到Windows

在UCDOS的五笔输入法移植到Windows

移植,五笔输入法,电脑软件,UCDOS,Windows9x,用UCDOS五笔输入法的用户,由于系统升级,Windows 9X系统的使用,但输入文字,仍不忘五笔输入法下的UCDOS,然后你可以在UCDOS移植使用五笔输入法,供您使用。具体方法如下: 第一步:使用通用输入法管理IMDMNG.…

整合五大广告形式:网吧明星传媒走进

整合五大广告形式:网吧明星传媒走进

时代,营销,五大,形式,网吧,整合五大广告形式:网吧明星传媒走进新的营销时代 整合五大广告形式:网吧明星传媒走进新的营销时代 随着互联网用户的增长,网吧的结构变化,网吧功能的多样化和互联网用户消费能力的提高,网吧已经成为一个新的广告载体…