我有一个名为 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;
}
现在,我想做这样的事情“https://stackoverflow.com/questions/10409476/how-to-draw-circle-using-multitouch”,但我无法更改此方法来执行此操作。 并且绘图只需保留在一个视图中。
有什么方法可以让用户画这样的东西吗?因为这两种类型的绘制取决于运动事件。
你需要让动作足够不同,这样你才能在做错动作之前分辨出他们正在尝试做哪一个。 例如,如果一个行为需要 2 个手指向下,另一个需要一个手指向下,那么一旦他们开始移动第一根手指,您就可以假设他们正在执行单指行为。
您确实没有向我们提供足够的信息来告诉您如何针对您的案例进行操作。 我可以告诉你,你需要更改 onTouchEvent 以在其中包含更多逻辑 - 尝试多路复用触摸事件最终会在其中产生非常复杂的代码,通常你最终会得到某种形式的状态机。
您可以在
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);
}
并且您可以直接在屏幕上绘图。