2016-12-18 101 views
0

我正在創建一個Android應用程序,useres可以在平板電腦上使用活動筆進行繪製和書寫。 用戶可以選擇不同的模式(例如鋼筆,橡皮擦,線條,圓圈......),爲他們提供不同的工具。
線條和圓形工具可讓用戶繪製線條/圓形,其長度/半徑和方向可由用戶繪製。這工作得很好,但每次用戶移動筆時都會繪製另一條線/圓,並填滿屏幕。Android:讓用戶從一個點繪製一條線到另一個點

圖片: Current result vs. how it should be when drawing from circle center

代碼:

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 
    mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
    canvas = new Canvas(mBitmap); 
} 

@Override 
protected void onDraw(Canvas c){ 
    c.drawBitmap(mBitmap, 0, 0, bitmapPaint); 
} 

private float mX, mY, firstX, firstY; 

private void touch_start(float x, float y) { //called from MotionEvent.ACTION_DOWN 
    path.moveTo(x, y); 
    firstX = x; 
    firstY = y; 
    mX = x; 
    mY = y; 
} 

private void touch_move(float x, float y) { //called from MotionEvent.ACTION_MOVE 
    path.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
    switch(mode){ 
     case "line": 
      canvas.drawLine(firstX, firstY, x, y, paint); 
      break; 
     case "circle": 
      canvas.drawCircle(firstX, firstY, (Math.abs(firstX-x) + Math.abs(firstY-y))/1.5f, paint); // divisor 1.5 just a rough value 
      break; 
     default: 
      canvas.drawPath(path, paint); 
      break; 
    } 
    mX = x; 
    mY = y; 
} 

有沒有人一個想法如何,我可以解決這一問題?
在此先感謝。

+0

你可能需要一個'canvas.reset()'之前每個'drawXxx()'。如果你在調用'touch_move()'之前沒有'invalidate()',你可能也需要這個。 – Gary99

回答

0

我自己找到了解決方案。
我用它自己的animationBitmap創建了一個新的Canvas animationCanvas,用於在繪製時顯示圓。
最後的圓圈在MotionEvent.ACTION_UP的方法中繪製。

這是新touch_move

private void touch_move(float x, float y) { //called from MotionEvent.ACTION_MOVE 
    path.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
    switch(mode){ 
     case "line": 
      animationCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); // clear previously drawn line (for animation) 
      animationCanvas.drawLine(firstX, firstY, x, y, paint); 
      break; 
     case "circle": 
      animationCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); // clear previously drawn circle (for animation) 
      animationCanvas.drawCircle(firstX, firstY, (Math.abs(firstX-x) + Math.abs(firstY-y))/1.5f, paint); // divisor 1.5 just a rough value 
      break; 
     default: 
      canvas.drawPath(path, paint); 
      break; 
    }  
    mX = x; 
    mY = y; 
} 

也許不是最好的解決辦法,但它的工作原理:)

相關問題