2017-06-14 34 views
0

我想用多條直線繪製自定義形狀。爲此,我使用了畫布。但我只能畫一條線。當我畫第二個時,以前消失。 我的代碼給出。如何使用多行繪製自定義形狀

public class CanvasBackground extends View { 

public Paint paint; 
public Context context; 
public Canvas canvas; 
public ScaleGestureDetector scaleGestureDetector; 
float scalfactor = 1f; 
boolean isDrawing; 
private PointF startPoint, endPoint; 

public CanvasBackground(Context context) { 
    super(context); 
    this.context = context; 
    paint = new Paint(); 
    scaleGestureDetector = new ScaleGestureDetector(context, new CanvasScale()); 
    setDrawingCacheEnabled(true); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    this.canvas = canvas; 
    paint.setColor(Color.WHITE); 
    canvas.drawPaint(paint); 
    canvas.save(); 
    DrawingZoomingCanvas(canvas); 
    DrawingLine(canvas); 

    canvas.restore(); 
    Log.e("OnDraw >>>", "CALLING"); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      startPoint = new PointF(event.getX(), event.getY()); 
      endPoint = new PointF(); 
      isDrawing = true; 
      break; 
     case MotionEvent.ACTION_MOVE: 
      if (isDrawing) { 
       endPoint.x = event.getX(); 
       endPoint.y = event.getY(); 
       invalidate(); 
      } 
      break; 
     case MotionEvent.ACTION_UP: 
      if (isDrawing) { 
       endPoint.x = event.getX(); 
       endPoint.y = event.getY(); 
       //isDrawing = false; 
       invalidate(); 
      } 
      break; 
     default: 
      break; 
    } 
    //scaleGestureDetector.onTouchEvent(event); 
    Log.e("OnTouch >>>", "CALLING" + isDrawing); 
    return true; 
} 

//drawing Matrix Canvas With Zoom 
private void DrawingZoomingCanvas(Canvas canvas) { 
    //drawing Matarix 
    canvas.translate(scalfactor * 10, scalfactor * 10); 
    canvas.scale(scalfactor, scalfactor); 
    paint.setColor(Color.rgb(220, 220, 220)); 
    for (int i = 0; i <= canvas.getHeight() * scalfactor; i += 10) { 
     canvas.drawLine(i, 0, i, canvas.getHeight(), paint); 
     canvas.drawLine(0, i, canvas.getWidth(), i, paint); 
    } 
} 

//drawing a line 
private void DrawingLine(Canvas canvas) { 
    paint = new Paint(); 
    paint.setColor(Color.RED); 
    paint.setStyle(Paint.Style.STROKE); 
    paint.setStrokeWidth(2); 
    paint.setAntiAlias(true); 
    if (isDrawing) 
     canvas.drawLine(startPoint.x, startPoint.y, endPoint.x, endPoint.y, paint); 

} 

private class CanvasScale extends ScaleGestureDetector.SimpleOnScaleGestureListener { 
    @Override 
    public boolean onScale(ScaleGestureDetector detector) { 
     scalfactor *= scaleGestureDetector.getScaleFactor(); 
     scalfactor = Math.max(0.1f, Math.min(scalfactor, 10.0f)); 
     invalidate(); 
     return true; 
    } 
} 
} 
+0

你想要繪製的形狀 –

+0

任何自定義形狀。這不是最終的。 –

+0

你有沒有找到代碼? –

回答

0

您每次畫一條線時都會清除畫布,因此當您繪製新線時,上一行將被擦除。

您需要將以前的行存儲在位圖中,以便在繪製新圖形時可以繪製這些行。

+0

行上設置點擊監聽器,謝謝。但你能幫助如何做到這一點? –

+0

好吧,可惜我對Android Canvas繪圖知之甚少,我只是在查看代碼時才注意到它。所以我不能對實際的最佳實踐代碼有很大的幫助,但我想你可以在這裏採取多種方法。 首先,您的DrawingZoomingCanvas()方法爲您清除整個畫布。你可以做的是存儲你在列表中繪製的任何線條,並在你的DrawingZoomingCanvas()方法的末尾遍歷這個列表來重繪你之前製作的任何線條。 –

+0

非常感謝。 –