在本文中我们将实现图片滚动的功能,其实现的原理是相似的,只不过图片的相对复杂一些。
首先我们应该准备一个大小适当的图片,目的是实现让他从屏幕底部滚动到屏幕的中间。这样的情况比较简单,我们不需要考虑双缓冲的问题。有的时候我们需要自己绘画图片,可能算发挥比较复杂,这时候就需要考虑双缓冲问题,为了得到更好的效果,避免闪屏,我们应该在后台画图然后把它copy到当前屏幕的适当位置,因为copy的速度是比你直接在当前屏幕画的速度快的。在Canvas类中提供了一个函数isDoubleBuffered(),如果返回true的话,那么表示设备支持双缓冲,那么我们就没有必要自己实现这个技术了。如果返回false那么我们就应该使用双缓冲技术。
为了简单我们使用一个图片代替我们自己画的工作,这样我们没有使用双缓冲的可能了,因为只有通过指定width和height的空的图片才是可以修改的。像从jar文件中读取、从子节数组中创建的图片都是不可修改的。
下面是源代码
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Form;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class GuessNumber extends MIDlet
{
private Display display;
private WelcomeCanvas welcomeCanvas;
private Form mainForm;
protected void startApp() throws MIDletStateChangeException
{
initMIDlet();
}
private void initMIDlet()
{
display = Display.getDisplay(this);
mainForm = new Form("Guess Number");
mainForm.append("this is a game");
welcomeCanvas = new WelcomeCanvas(display,mainForm);
display.setCurrent(welcomeCanvas);
}
protected void pauseApp()
{
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException
{
}
}
public class WelcomeCanvas extends Canvas
{
private Display display;
private Displayable next;
private Timer timer = new Timer();
private int width = getWidth();
private int height = getHeight();
private int i = height;
private int left;
private int incHeight;
private Image image;
private boolean going = true;
public WelcomeCanvas(Display display, Displayable disp) {
super();
image = getImage("image.png");
left = (width - image.getWidth()) / 2;
incHeight = image.getHeight();
this.display = display;
this.next = disp;
ScrollTask st = new ScrollTask();
timer.schedule(st, 100, 100);
}
private Image getImage(String fileName)
{
try
{
return Image.createImage("/" + fileName);
} catch (IOException e)
{
return null;
}
}
protected void paint(Graphics arg0)
{
int oldColor = arg0.getColor();
arg0.setColor(255, 255, 255);
arg0.fillRect(0, 0, width, height);
arg0.setColor(oldColor);
arg0.drawImage(image, left, i, Graphics.LEFT | Graphics.TOP);
}
public void keyPressed(int keyCode)
{
if (!going)
display.setCurrent(next);
}
private class ScrollTask extends TimerTask
{
public void run()
{
if (i > height / 2)
{
i = i - incHeight;
repaint();
} else
{
going = false;
timer.cancel();
}
}
}
}