当前页面: 开发资料首页 → 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变量给去了,没什么用,帮倒忙的东西