如何让用户用手指画画并在Android上绘制几何图形?

时间:2016-11-09 19:20:17

标签: android

我有一个名为DrawingView的类,其中我有方法onTouchEvent(MotionEvent event)对触摸事件的响应。在这种方法中,我允许用户以自由模式进行绘制,用户只需触摸屏幕即可自由绘制。 但问题是我想让用户绘制几何图形,但它也取决于onTouchEvent()方法。

以下是该方法的代码:

@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",但我不能改变这种方法来做到这一点。 而且图纸只需要保留在一个视图中。

有一些方法可以让用户像这样绘制这些?因为两种类型的绘制取决于Motion Events。

2 个答案:

答案 0 :(得分:0)

你需要让动作变得足够不同,以便在做出错误的动作之前告诉你他们想要做哪一个动作。例如,如果一个行为需要两个手指向下并且一个手指需要一个手指向下,一旦他们开始移动他们的第一个手指,您可以假设他们正在做一个手指行为。

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

答案 1 :(得分:0)

您可以在Bitmap上绘图,然后在Canvas方法中将其复制到onDraw()。为此你可以创建这样的类:

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);
}

你可以直接在屏幕上画画。