站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2ME 专题怎么在j2me里面用动画?

怎么在j2me里面用动画?

摘要: 怎么在j2me里面用动画?


j2me好像就支持png的图片吧.那如果我要实现类似gif动画的效果应该怎么作呢?


切换图片呀。
其实me不只支持png,jsr 185还要求支持jpeg。me处在一个开放的环境中,众多的jsr慢慢由草稿转向实用


怎么切换呢?稍微介绍一下.


不同时刻显示不同的图片就产生了动画@_@...


那样子话我就要在手机里面放置好几张图片咯这样不就增加了内存的负担了??这样产生的动画也不连贯吧..除非一秒2,30帧..那样的化....


你要这样的话,放个电影不更好


呵呵..如果一张动态图片是在要服务端发给手机终端的.那不是要发送好几张了?


oTZ... 面壁吧...

墙壁裂开的时候 阳光就会透进来 当然这种假设是建立在墙壁在白天裂开的前提下 T T

支持gif又能有什么更高明的解决办法呢。在计算机上寻找解决方案是一种回溯的行为,因为源头是明确的。

动画的原理只有一个…… 显示对应时刻的图片T_T


问题是它不支持gif,你也没办法,java这东西,又不是你想自己做个解码器就一定可以无缝插入的


你可以把多个PNG放到一张PNG上不就得了


楼上的怎么解释?多个PNG放到一张PNG上?


老兄,程序员不是让别人解决问题的职业。


我明白意思了。请问如果我有5张png图片做成动画。1~5显示后再1~5显示。那是不是每次都要 Image.createImage()一下?这样是不是会用太多内存?怎么优化下?我是用两个方法。一个是把5个image对象addElement到一个向量里面,再每次需要一个image就拿一个出来。一直这样循环。。这个方法怎样。我发现只会显示第一张图片。后面的就不会显示了


public class CShowImage extends Canvas{

private int imgNum;
private Display m_pDisplay;
private Vector m_vImg;


public CShowImage(Display display){
imgNum = 1;
m_pDisplay = display;
m_vImg = new Vector(10, 5);
StoreImg(5);
}

protected void paint(Graphics g){
try{
g.setColor(0, 0, 0);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(255, 255, 255);
g.drawString("动画", 0, 0, Graphics.LEFT | Graphics.TOP);
if(imgNum == 6){
imgNum = 1;
}
//Image img = Image.createImage("/small_" + imgNum + ".png");
Image img = PickUpImg(imgNum);
g.drawImage(img, 30, 20, Graphics.LEFT | Graphics.TOP);
imgNum++;

}catch(Exception e){
System.out.println("paint error..." + e.toString());
}
}

protected void changImg(){
//Thread thread = Thread.currentThread();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
repaint();
}

public void Draw(){
m_pDisplay.setCurrent(this);
for(int i = 0; i < 10; i++){
changImg();
i++;
if(i == 10){
i = 0;
}
}

}

protected void StoreImg(int imgCount){
try{
for(int i = 1; i <= imgCount; i++){
Image img = Image.createImage("/small_" + imgNum + ".png");
m_vImg.addElement(img);
}
}
catch(Exception e){
System.out.println("Stroreimg error..." + e.toString());
}
}

protected Image PickUpImg(int imgNum){
Image imgTemp = (Image)m_vImg.elementAt(imgNum);
return imgTemp;
}

}

大哥们,帮看看哪里的问题。


重画没能形成链条

你的paint方法只在调用setCurrent时候被调用了一次

提示就到这里T.T


仔细看一下,问题比想象的麻烦。把整个程序贴出来吧。


不过猜测是你把所有东西都塞在startApp里了。


public class CCartoonMidlet extends MIDlet implements Runnable{
/**
* the CartoonMidlet
*/
private static CCartoonMidlet instance;

private Display m_pDisplay;

private Canvas canvas;

/**
* is initialized ?
*/
private boolean bIsInit;

public CCartoonMidlet() {
super();
instance = this;
m_pDisplay = Display.getDisplay(this);
bIsInit = false;
}

public final static CCartoonMidlet GetTheMidlet(){
return instance;
}



protected void startApp() throws MIDletStateChangeException {

Thread self = new Thread(this);
self.start();

}

protected void pauseApp() {
// TODO Auto-generated method stub

}

protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// TODO Auto-generated method stub

}

public void run(){
CShowImage showImg = new CShowImage(m_pDisplay);
showImg.Draw();
}


}

还有一个文件就是这个了。。。问题很大的吗??



我刚刚debug了一下。为什么我的repaint没有用呢??


在我这里跑大体正常……只能猜了 现在能不能确定每次repaint都调用paint了?

如果没有在repaint后面加个serviceRepaints看看

另外你过分地把简单问题复杂化了


呵呵。初学者是这样子的。。楼上的大哥。你怎么简化一下呢


我加了serviceRepaints。好像还是那个问题。就是只显示出一张就不动了。打印出来的trace一样是


正在通过存储根 DefaultColorPhone 来运行
paint error...java.lang.ArrayIndexOutOfBoundsException: 5 >= 5
paint error...java.lang.ArrayIndexOutOfBoundsException: 5 >= 5
Execution completed.
737739 bytecodes executed
22 thread switches
741 classes in the system (including system classes)
4052 dynamic objects allocated (127780 bytes)
3 garbage collections (91508 bytes collected)


for(int i = 1; i <= imgCount; i++){
Image img = Image.createImage("/small_" + imgNum + ".png"); <- 因为我没图片所以我把这行改了... 果然是这行出问题了X.,Xb
m_vImg.addElement(img);


import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public final class M extends MIDlet
{
public void startApp()
{
Main.init();

Main canvas = new Main();

Display.getDisplay(this).setCurrent(canvas);

while (true)
{
try
{
Thread.sleep(1000);
}
catch (Exception e)
{
}

canvas.repaint();
canvas.serviceRepaints();
}
}

public void pauseApp()
{
}

public void destroyApp(boolean uc)
{
}
}

final class Main extends Canvas
{
static Image[] m_imgPool = new Image[5];

static int m_frame;

public void paint(Graphics g)
{
g.setColor(0);
g.fillRect(0, 0, 100, 100);
g.drawImage(m_imgPool[m_frame++], 0, 0, Graphics.TOP | Graphics.LEFT);

m_frame %= 5;
}

static void init()
{
for (int i = 0; i < 5; i++)
{
Image t = Image.createImage(100, 100);

t.getGraphics().drawString(Integer.toString(i), 0, 0, Graphics.TOP | Graphics.LEFT);

m_imgPool[i] = t;
}
}
}

当然这是一个简略到过份的情况。


谢谢楼上 忧郁的流浪汉,我结帖了。。这个我在弄弄。。。


↑返回目录
前一篇: 一点想法,欢迎大家评述!!!
后一篇: 急需帮忙!