2012-03-10 10 views
2

我正在嘗試創建一個可以使用我的光標鍵繪製任何東西的midlet。我使用了drawLine方法。但是我想創建一條線,然後改變方向,保持上一條線,但是線保持旋轉。J2ME:如何保存通過使用drawline()創建的線條,並從線條的結束點開始再保留前一個?

基本上我應該能夠在任何方向繪製任何東西。

這是我的代碼:

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); 
} 
} 

回答

1
/* 
* 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); 
} 
} 
1

你的代碼刪除,然後在屏幕繪製每次重繪一次一行。

Graphics.fillRect(0,0,width,length)paint()擦除屏幕)

行總是開始在屏幕的中心,因爲x1y1永遠不會改變。

用戶輸入僅改變行的終點。

這不是你想要做的。

有做什麼你問的2種方式:
- 記住每一個用戶輸入(在載體中),清除屏幕重繪所有的線路每次重繪時間。從內存或閃爍的角度來看,效率不高。
- 停止擦除屏幕,併爲每個用戶輸入畫一條新線。

在這兩種情況下,您可能都希望在每次調用drawLine();後執行x1=x2;y1=y2;,以便將下一行的原點移動到上一行的末尾。

我也認爲你想實施keyRepeated()以改善用戶體驗。

當您重新繪製時,您還可以更改剪輯(使用Graphics.setClip()),以便手機僅更新屏幕的一小部分以提高性能。

如果您想要使用雙緩衝(在內存中保留一個Image,然後將其繪製在屏幕上),則每次要繪製時都需要停止刪除圖像(使用fillRect())它。

爲了使用雙緩衝,你需要Image.getGraphics()Graphics.drawImage()

+0

謝謝您的回覆,我在實現你所說的話有問題。你說:「停止擦除屏幕,併爲每個用戶輸入畫一條新線。」現在我該如何停止擦除屏幕?我如何保存它?我正在使用keyPressed(),現在如您所建議的keyreapeated(),而不重繪我如何繪製一個保留前一個的newLine? 2.someone建議我畫一幅圖片並保存,然後覆蓋該圖片....我沒有成功地做到這一點。 – rumman0786 2012-03-24 08:21:39

+0

3. x1 = x2; y1 = y2; 我明白這一點,也做了你告訴我要做的事情,但問題是因爲我無法將我以前的繪圖保存在屏幕中,它總是被刪除並變成指針/鼠標。這裏是我修改的代碼... 你能告訴我如何實現我想要做的事情嗎? – rumman0786 2012-03-24 08:35:51

+0

答案已更新爲1和2。對於3,您沒有在正確的位置添加新代碼。再次閱讀答案。 – 2012-03-26 02:49:32

相關問題