Java me J2ME:如何保存使用drawline()创建的一条线,并从该线重新开始';保持上一个的目的是什么?
我正在尝试创建一个midlet,通过它我可以使用光标键绘制任何东西。我用了抽绳法。但我想创建一条线,然后改变方向,保持前一条线,但该线保持旋转 基本上我应该能够画任何方向的东西 这是我的代码: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
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,宽度,长度)
inpaint()
擦除屏幕)
该行始终从屏幕中央开始,因为x1
和y1
从未更改
用户输入仅更改线的端点
这似乎不是你想做的
有两种方法可以满足您的要求:-记住每个用户输入(矢量),每次重新绘制时清除屏幕并重新绘制所有行。从记忆或闪烁的角度来看,效率不高。
-停止擦除屏幕,只需为每个用户输入画一条新线 在这两种情况下,您可能希望执行
x1=x2;y1=y2每次调用drawLine()后的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);
}
}