2016-11-09 53 views
-1

我有一个叫DrawingView的类,在那里我有方法onTouchEvent(MotionEvent event)对触摸事件作出响应。在这种方法中,我允许用户在自由模式下绘制,用户只需触摸屏幕并自由绘制。 但问题是我想允许用户绘制几何图形,但它也取决于onTouchEvent()方法。如何让用户使用手指进行绘制并在Android上绘制几何图形?

这里是方法的代码:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    float touchX = event.getX(); 
    float touchY = event.getY(); 

    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      drawPath.moveTo(touchX, touchY); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      drawPath.lineTo(touchX, touchY); 
      break; 
     case MotionEvent.ACTION_UP: 
      drawCanvas.drawPath(drawPath, drawPaint); 
      drawPath.reset(); 
      break; 
     default: 
      return false; 
    } 

    invalidate(); 
    return true; 
} 

现在,我想要做这样的事情“how to draw circle using Multitouch”,但我不能改变这个方法来做到这一点。 而且图纸只需保留在一个视图中。

有一些方法可以让用户像这样画出来吗?因为这两种类型的绘制取决于运动事件。

回答

0

您需要使动作有所不同,以至于在做出错误之前,您可以分辨出他们正在尝试做哪一个动作。例如,如果一个行为需要2个手指向下,并且需要一个手指向下,那么只要他们开始移动他们的第一根手指,就可以假定他们正在做一个手指的行为。

你真的没有给我们足够的信息告诉你如何为你的情况做到这一点。我可以告诉你,你需要改变onTouchEvent以获得更多的逻辑 - 尝试复用触摸事件最终会产生非常复杂的代码,通常你会得到某种形式的状态机。

0

您可以利用Bitmap并将其复制到CanvasonDraw()方法中。为此,您可以像这样创建类:

class GraphicsView extends View { 
    private Bitmap buffCanvasBitmap = null; 
    private Canvas buffCanvas = null; 
    private float x = 0; 
    private float y = 0; 
    private float old_x = 0; 
    private float old_y = 0; 
    private Paint paint = new Paint(); 

    public GraphicsView(Context context) { 
     super(context); 
     paint.setColor(Color.BLUE); 
     paint.setTextSize(20); 
     paint.setAntiAlias(true); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     if (buffCanvasBitmap == null) { 
      buffCanvasBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_4444); 
      buffCanvas = new Canvas(buffCanvasBitmap); 
      buffCanvas.drawColor(Color.LTGRAY); 
     } 

     canvas.drawBitmap(buffCanvasBitmap, 0, 0, null); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     old_x = x; 
     old_y = y; 

     x = event.getX(); 
     y = event.getY(); 

     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       break; 
      case MotionEvent.ACTION_MOVE: 
       buffCanvas.drawLine(old_x, old_y, x, y, paint); 
       break; 
      case MotionEvent.ACTION_UP: 
      case MotionEvent.ACTION_CANCEL: 
       break; 
     } 
     invalidate(); 
     return true; 
    } 
} 

和比这种方式使用它,例如,在你的Activity

public GraphicsView gv; 
... 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 

    gv = new GraphicsView(this); 
    setContentView(gv); 
} 

,你可以在屏幕上直接绘制。