2017-06-14 35 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

非常感谢。 –