我有一个名为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。
答案 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);
}
你可以直接在屏幕上画画。