2012-05-17 22 views
2

我想在Android上構建一個工具,用戶可以在畫面上繪製一些簡單的對象(例如線,圓或箭頭)。我開始嘗試線條部分,並且確實可以成功繪畫。邏輯是,用戶點擊一點,然後拖動他們的手指,畫線。我用這樣一個類(它是基於DonGru's answer here):Android - 用戶用他們的手指畫線

public class DrawView extends View { 
    Paint paint = new Paint(); 
    float Sx, Sy, Lx, Ly; 

    public DrawView(Context context, float x1, float y1, float x2, float y2) { 
     super(context); 

     paint.setColor(Color.RED); 
     Sx=x1; 
     Sy=y1; 
     Lx=x2; 
     Ly=y2; 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
      canvas.drawLine(Sx, Sy, Lx, Ly, paint); 
    } 
} 

從活動代碼我使用onTouch監聽器是這樣的:

@Override 
public boolean onTouch(View view, MotionEvent event) { 
    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      Sx1 = event.getX(); 
      Sy1 = event.getY(); 
      return true; 

     case MotionEvent.ACTION_MOVE: 
      Cx1 = event.getX(); 
      Cy1 = event.getY(); 
      drawLine(); 
      return true; 

     case MotionEvent.ACTION_UP: 
      Lx1 = event.getX(); 
      Ly1 = event.getY(); 
      return true; 
     } 
    return false; 
} 

public void drawLine(){ 

    setContentView(R.layout.show); 
    ImageView myImage = (ImageView) findViewById(R.id.lastphoto); 
    myImage.setImageBitmap(rotatedPic); 

    dv=new DrawView(this, Sx1, Sy1, Cx1, Cy1); 

    addContentView(dv, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, 
      ViewGroup.LayoutParams.FILL_PARENT)); 

    RelativeLayout mRelativeLayout = (RelativeLayout) findViewById(R.id.linear); 
    mRelativeLayout.setOnTouchListener((OnTouchListener) this); 
    mRelativeLayout.addView(new Drawer(this)); 
} 

上的一舉一動我重新創建整個視圖,因此從開始到結束點只有一行是可見的。我首先關心的是我不知道這個實現是否正確。另外,我希望將這些行作爲創建後的對象進行處理。用戶應該能夠移動它們,旋轉它們,刪除等等。我認爲我可以通過將每行邊緣的座標保存爲緩衝區等方式來實現這一點,並且如果用戶點擊的距離非常接近邊緣,我可以處理那個手勢。但所有這些聽起來都太複雜了,我不知道這是不是很不穩定。

是否有一些不同的方法,我應該用來實現這樣的東西,我完全失蹤?

+0

你的實現很奇怪。爲了實現這樣一個程序,你需要一個'View',重寫它的'onDraw'方法,處理用戶的拖動動作,並相應地調用View.invalidate()。 – neevek

+0

你的意思是創建一個擴展視圖的對象?像DrawView一樣,我將它作爲繪製的類來使用?但在這個對象的實例上調用invalidate不會擦除前面的行。你有一個例子的鏈接,以便我能理解你的意思嗎? – george

回答

5

在我看來,存儲繪製的線條,並使用戶能夠操縱它們,只是比較複雜。

創建一個Line類。包括開始和結束座標,顏色等作爲類的字段和刪除,移動等的方法。還要添加一個接受MotionEvent參數的方法。在這種方法中,您可以使用MotionEvent來確定是否觸摸了這一行,並根據需要調整它的位置。

在擴展View類的集合或列表中存儲對每條線的繪製(作爲Line類的一個實例創建)的引用,ArrayList應該這樣做。然後,在onTouch事件中,調用每行的觸摸檢測方法並將MotionEvent傳遞給方法。

最後,重寫視圖的onDraw回調以通過遍歷Line實例的引用集合來繪製每一行。

您還可以添加更多的手勢,如長按刪除等。這是一個(完全未經測試,從內存中寫入)這種方法的骨架。

class Line 

    public float x1, x2, y1, y2; 

    public void detectTouch(MotionEvent motionEvent){ 

     // code to detect a touch and adjust the x and ys accordingly 

    } 

class DrawView extends View{ 

    private ArrayList<Line> lines = new ArrayList<Lines>(); 

    .... 
    .... 

@Override 
public void onDraw(Canvas canvas) { 

    super.onDraw(); 

    for (Line line : lines){ 
     canvas.drawLine(line.x1,line.y1,line.x2,line.y2); 
    } 
} 

@Override 
public boolean onTouch(View view, MotionEvent event) { 

    .... 
    .... 

    for (Line line : lines){ 
     line.detectTouch(MotionEvent); 
    } 


} 

玩得開心!

+0

,看起來很有前途,謝謝!我會嘗試,並根據你的建議讓你知道 – george

+0

我設法使它工作到現在非常好!非常感謝你! – george

+0

嘿喬治。很高興聽到它的幫助。祝你好運,,, – Simon