Java me J2ME:如何保存使用drawline()创建的一条线,并从该线重新开始';保持上一个的目的是什么?

Java me J2ME:如何保存使用drawline()创建的一条线,并从该线重新开始';保持上一个的目的是什么?,java-me,drawing,midp,lcdui,Java Me,Drawing,Midp,Lcdui,我正在尝试创建一个midlet,通过它我可以使用光标键绘制任何东西。我用了抽绳法。但我想创建一条线,然后改变方向,保持前一条线,但该线保持旋转 基本上我应该能够画任何方向的东西 这是我的代码: public class Pacer extends MIDlet{ public void startApp() { Displayable d = new PacerCanvas(); d.addCommand(new Command("Exit", Command.EXIT, 0)); d.set

我正在尝试创建一个midlet,通过它我可以使用光标键绘制任何东西。我用了抽绳法。但我想创建一条线,然后改变方向,保持前一条线,但该线保持旋转

基本上我应该能够画任何方向的东西

这是我的代码:

public class Pacer extends MIDlet{
public void startApp() {
Displayable d = new PacerCanvas();

d.addCommand(new Command("Exit", Command.EXIT, 0));
d.setCommandListener(new CommandListener() {
  public void commandAction(Command c, Displayable s) {
    notifyDestroyed();
  }
} );

Display.getDisplay(this).setCurrent(d);
 }

public void pauseApp() { }

public void destroyApp(boolean unconditional) { }
}
/**
*
* @author Rumman
*/
import javax.microedition.lcdui.*;

public class PacerCanvas extends Canvas {

private String name;
private int w,h,x1,y1,x2,y2;

public PacerCanvas(){
w = getWidth();
h = getHeight();
x1 =  w/2 ;
y1 = h/2 ;
x2 = x1 ;
y2 = y1 ;
}

protected void keyPressed(int key){
    name = getKeyName(key);
    if(name.equals("Right") || name.equals("6")){
    x2++;
    }
    else if(name.equals("Left") || name.equals("4")){
    x2--;
    }
    else if(name.equals("Up") || name.equals("2")){
    y2--;
    }
    else if(name.equals("Down") || name.equals("8")){
    y2++;
    }
    else if(name.equals("1")){
        x2--;
        y2++;
    }
    else if(name.equals("3")){
        x2++;
        y2++;
    }
    else if(name.equals("7")){

    }
    else if(name.equals("9")){
    }
    repaint();  
}

public void paint(Graphics g) {

g.setColor(0xffffff);
g.fillRect(0, 0, w, h);

g.setColor(0x000000);
g.drawLine(x1, y1, x2, y2);
}
}

代码会擦除屏幕,然后在每次重新绘制时绘制一行

Graphics.fillRect(0,0,宽度,长度)
in
paint()
擦除屏幕)

该行始终从屏幕中央开始,因为
x1
y1
从未更改

用户输入仅更改线的端点

这似乎不是你想做的

有两种方法可以满足您的要求:
-记住每个用户输入(矢量),每次重新绘制时清除屏幕并重新绘制所有行。从记忆或闪烁的角度来看,效率不高。
-停止擦除屏幕,只需为每个用户输入画一条新线

在这两种情况下,您可能希望执行
x1=x2;y1=y2drawLine()后的code>以将下一行的原点移动到上一行的末尾

我还认为您希望实现
keyreated()
,以改善用户体验

您还可以在重新绘制时更改剪辑(使用
Graphics.setClip()
),以便手机仅更新屏幕的一小部分以提高性能

如果要使用双缓冲(将一个图像保留在内存中,绘制到其中,然后在屏幕上打印),每次绘制图像时仍需要停止擦除图像(使用
fillRect()


为了使用双缓冲,您需要
Image.getGraphics()
Graphics.drawImage()

谢谢您的回复,我在实现您所说的内容时遇到了问题。1.你说:“停止擦除屏幕,为每个用户输入画一条新的线。”现在我如何停止擦除屏幕?我怎样才能保存它?我正在使用keyPressed(),现在正如您建议的keyreapeated(),在不重新绘制的情况下,如何绘制一条保留前一条的新线?2.有人建议我在一张图片上画图并保存,然后在该图片上覆盖……我没有成功。x1=x2;y1=y2;我明白这一点,也照你说的做了,但问题是我不能在屏幕上保存我以前的画,它总是被删除,变成指针/鼠标。这是我修改过的代码。。。你能告诉我如何实现我正在尝试做的事情吗?答案更新为1和2。对于3,您没有在正确的位置添加新代码。再次阅读答案。谢谢你,@QuickRecipesOnSymbianOS,谢谢你的帮助。我做了我想做的事。下面给出了我的代码作为答案。
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

/**
*
* @author Rumman
*/
import javax.microedition.lcdui.*;

public class PacerCanvas extends Canvas {

private String name;
private int w,h,x1,y1,x2,y2;
private Image image;
private Graphics ig;
public PacerCanvas(){
w = getWidth();
h = getHeight();
x1 =  w/2 ;
y1 = h/2 ;
x2 = x1 ;
y2 = y1 ;
image = Image.createImage(w,h);

ig = image.getGraphics();

ig.setColor(255, 255, 255);
ig.fillRect(0, 0, w, h);

}
protected void keyRepeated(int key){
keyPressed(key);
keyPressed(key);// I used this method multiple times as it makes it faster 
keyPressed(key);
keyPressed(key);
keyPressed(key);
keyPressed(key);
keyPressed(key);
keyPressed(key);
}
protected void keyPressed(int key){
    name = getKeyName(key);
    if(name.equals("Right") || name.equals("6")){
    x2++;
    }
    else if(name.equals("Left") || name.equals("4")){
    x2--;
    }
    else if(name.equals("Up") || name.equals("2")){
    y2--;
    }
    else if(name.equals("Down") || name.equals("8")){
    y2++;
    }
    else if(name.equals("1")){
        x2--;
        y2--;
    }
    else if(name.equals("3")){
        x2++;
        y2--;
    }
    else if(name.equals("7")){
        x2--;
        y2++;
    }
    else if(name.equals("9")){
        x2++;
        y2++;
    }
    repaint();  
}

public void paint(Graphics g) {


ig.setColor(0x000000);
ig.drawLine(x1, y1, x2, y2);
g.drawImage(image, 0, 0, Graphics.TOP|Graphics.LEFT);
x1=x2;
y1=y2;


}

public void draw(Image i) {
Graphics ig = i.getGraphics();
Pacer p = new Pacer();
// p.Display.getDisplay(this).setCurrent(i);
}
}