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

当前页面: 开发资料首页J2ME 专题用j2me怎么实现图片一点点的覆盖

用j2me怎么实现图片一点点的覆盖

摘要: 用j2me怎么实现图片一点点的覆盖


就是显示一张图片,从左往右,或从右往左一点点显示,就象书翻页似的,一点点压过去,应该怎么写啊,是不是可以用sprite,怎么实现啊


setClip过去咯,


能不能说明白一点,我不会呢,要是有代码能不能给一段,我msn ccdxdinglina@hotmail.com


这个很简单,现在你需要指定滚动速度常量,看成V,线程睡眠时间SLEEP_TIME
在setClip()的时候,Clip的X值为x = x - v * SLEEP_TIME,这样就实现了你要的效果,但是细节上的处理还得根据设计来完成


那要想实现 有两张图片,在第一张图片上有一个按钮,点这个按钮就可以到第2张图片,然后在第2张图片内按任意键就可以回去第一张图片给怎么实现啊


设置一个标志,显示图片1,标志1,显示图片2,标志2
在按键处理的时候判断标志,如果是1,只有点击按钮才做消息处理;如果是标志2,按任意键进行消息处理


我明白你的意思。但现在我不知道在什么地方加,是这样的,有3张图片连续播放不接受任何按键动作,到第4张的时候出现的这张图片上有3个按钮,分别是点击就可以进入第1张,第2张,第3张图片,进入每张图片后按任意键就回到第4张带按钮的这张图片,你能不能详细告诉我一下该怎么做,我只会设计这个流程,但真的不会写代码,上面也有我的msn,当然要是你有时间并且方便的话


就没有能说的详细一点吗


==,我写一下


我写了一个例子,不知道是不是你想要的,看看吧,有问题交流
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Graphics;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class Problem extends MIDlet {
public static Problem app;
MyCanvas c;
public Problem() {
// TODO Auto-generated constructor stub
c = new MyCanvas();
app = this;
}

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

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

}

protected void startApp() throws MIDletStateChangeException {
if (c != null) {
Display.getDisplay(this).setCurrent(c);
c.startFlip();
}
}
public void quitApp() {
try {
destroyApp(true);
} catch (MIDletStateChangeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
notifyDestroyed();
}
}
class MyCanvas extends Canvas implements Runnable {
Thread t;
public final static int SLEEP_INTERNAL = 50;
String content = "";
int status;
public final static int PROCESSING = 0;
public final static int FINISHED = 1;
public final static int STATUS1 = 2;
public final static int STATUS2 = 3;
public final static int STATUS3 = 4;
public String[] s = {"First Image", "Second Image", "Third Image"};
public void paint(Graphics g) {
g.setColor(0xffffff);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(0);
if (status == PROCESSING) {
g.drawString("Processing", 0, 0, Graphics.LEFT | Graphics.TOP);
g.drawString(content, getWidth() / 2 - g.getFont().stringWidth(content) / 2, getHeight() / 2 - g.getFont().getHeight() / 2, Graphics.LEFT | Graphics.TOP);
} else if (status == FINISHED) {
g.drawString("Finished", 0, 0, Graphics.LEFT | Graphics.TOP);
g.drawString("key 1 to first page ,any key to return;", 0, g.getFont().getHeight(), Graphics.LEFT | Graphics.TOP);
g.drawString("key 2 to second page ,any key to return;", 0, g.getFont().getHeight() * 2, Graphics.LEFT | Graphics.TOP);
g.drawString("key 3 to third page ,any key to return;", 0, g.getFont().getHeight() * 3, Graphics.LEFT | Graphics.TOP);
} else if (status == STATUS1) {
g.drawString("First image ,any key to return;", 0, g.getFont().getHeight(), Graphics.LEFT | Graphics.TOP);
} else if (status == STATUS2) {
g.drawString("Second image ,any key to return;", 0, g.getFont().getHeight(), Graphics.LEFT | Graphics.TOP);
} else if (status == STATUS3) {
g.drawString("Third image ,any key to return;", 0, g.getFont().getHeight(), Graphics.LEFT | Graphics.TOP);
}
}
public void startFlip() {
if (t == null) {
t = new Thread(this);
t.start();

Thread splash = new Thread(new Runnable() {

public void run() {
int counter = 0;
while (counter < s.length) {
content = s[counter++];
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
status = FINISHED;
}
});
splash.start();
}
}
public void stopFlip() {
t = null;
}
public void run() {
while (t != null) {
long startTime, endTime;
startTime = System.currentTimeMillis();
repaint();
serviceRepaints();
endTime = System.currentTimeMillis();
if (endTime - startTime < SLEEP_INTERNAL) {
synchronized (this) {
try {
wait(SLEEP_INTERNAL - (endTime - startTime));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
protected void keyPressed(int key) {
if (status == FINISHED) {
switch (key) {
case Canvas.KEY_NUM1 :
status = STATUS1;
break;
case Canvas.KEY_NUM2 :
status = STATUS2;
break;
case Canvas.KEY_NUM3 :
status = STATUS3;
break;
case Canvas.KEY_POUND :
Problem.app.quitApp();
break;
}
} else if (status == STATUS1 || status == STATUS2 || status == STATUS3) {
status = FINISHED;
}

}

}



其实,像这种问题,应该自己想办法解决,多想想,对自己有好处,我也是初学,大家多交流吧!^_^



谢谢哈哈,其实这是我第一次自己写东西,think you


弄了两天按任意键会了,但是用setclip画图还是没有实现,一下子就把整张图片显示出来了

我是这样的,线程中有input,在input里用case 当case是game的时候在paint里的case game里画的代码如下:
frontImageWidth=176;
g.setClip(0,0,frontImageWidth,Control.ScreenHeight);
g.drawImage(imgCurrent,Control.imgTitleX,Control.imgTitleY,Control.arc);
for(frontImageWidth=176;frontImageWidth>0;){
frontImageWidth -=8;
}
System.out.println( frontImageWidth);
g.setClip(0,0,Control.ScreenWidth,Control.ScreenHeight);
为什么不行呢?



你应该是把这段代码加到paint中去,当case是game的时就这样:
frontImageX = 176;
frontImageWidth=0;
g.setClip(frontImageX ,0,frontImageWidth,Control.ScreenHeight);
g.drawImage(imgCurrent,Control.imgTitleX,Control.imgTitleY,Control.arc);

frontImageX -= 8;
frontImageWidth += 8;

在线程中每次都repaint(),还有你自己对frontImageX 和frontImageWidth 的界限进行一种限制


为什么我一弄就不行


public class MainCanvas extends Canvas implements Runnable {
private int ImageX= 0;
private int ImageWidth=0;
public int gameStatus = 0;

public synchronized void start() {
nextRunLoop = true;
animationThread = new Thread(this);
animationThread.start();
}

public void run() {
try {
//根据刷新率,设定每个时间片等待的秒数
int interval = 1000 / Control.FPS;
//当运行状态为true并且线程等于当前线程时执行循环
//程序始终处于 "输入"->"处理"->"绘制" 循环中
long startTime;
while (nextRunLoop &&
animationThread == Thread.currentThread()) {
startTime = System.currentTimeMillis();
input();

//当双缓冲图片被更新后进行实际的绘制
if (needRepaint) {
repaint();
serviceRepaints();
needRepaint = false;
}
//Wait
long timeTaken = System.currentTimeMillis() - startTime;
if (timeTaken < interval) {
synchronized (this) {
animationThread.sleep(interval - timeTaken);
}
} else {
animationThread.yield();
}
//End of Wait
}
} catch (Exception e) {
e.printStackTrace();
}
}

public void input() {
int releaseStates = getKeyReleaseState();
int keyStates = getKeyStates();
switch (gameStatus) {

case Control.Games:
if (ye_index == Resource.dir[block_index].length - 1) {
gameStatus = Control.Splashfocus;
clearKeyStates();
} else {
loadNext();
ye_index++;
}
needRepaint = true;
break;
}
public void paint(Graphics g) {
switch (gameStatus) {
case Control.Games:
ImageX = 176;
ImageWidth=0;
g.setClip(ImageX ,0,ImageWidth,Control.ScreenHeight);
g.drawImage(imgCurrent,Control.imgTitleX,Control.imgTitleY,Control.arc);

ImageX -= 8;
ImageWidth += 8;

g.drawImage(imgSkin, 0, 0, g.TOP | g.LEFT);
needRepaint=true;

break;}

private void loadNext() {
imgCurrent = Control.loadImage(Resource.imgTitle[Resource.dir[ block_index][ye_index]]);
}



这是和这个翻页有关的代码,帮忙 看看


是学程序的么?


回楼上,是自己设计的手机应用,以前没写过代码,看过,这次想自己写。


把你的nextRunLoop变量给去了,没什么用,帮倒忙的东西


↑返回目录
前一篇: 绝对的新手!请教如门问题!
后一篇: 图片大小比屏幕大,自动从下向上移动该怎么实现