如何联系 canvas 点的特定项目
How to get touch for specific item in canvas point
我有 canvas 和 3 个要在触摸事件上拖动的点。这是我的代码。
public class Canvas7 extends View {
Paint p;
PointF point1;
PointF point2;
PointF point3;
public Canvas7(Context context) {
super(context);
p = new Paint(Paint.ANTI_ALIAS_FLAG);
p.setStrokeWidth(3);
point1 = new PointF(150, 200);
point2 = new PointF(150, 500);
point3 = new PointF(250, 300);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawARGB(80, 102, 204, 255);
p.setStyle(Paint.Style.FILL);
p.setColor(Color.GREEN);
canvas.drawCircle(point1.x, point1.y, 10, p);
p.setStyle(Paint.Style.FILL);
p.setColor(Color.BLUE);
canvas.drawCircle(point2.x, point2.y, 10, p);
canvas.drawCircle(point3.x, point3.y, 10, p);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
if (x > 0 && y > 0) {
if ((x < (point1.x + 20) && x > (point1.x - 20)) && (y < (point1.y + 20)) && y > (point1.y - 20)) {
invalidateCanvas(event, point1);
} else if ((x < (point2.x + 20) && x > (point2.x - 20)) && (y < (point2.y + 20)) && y > (point2.y - 20)) {
invalidateCanvas(event, point2);
} else if ((x < (point3.x + 20) && x > (point3.x - 20)) && (y < (point3.y + 20)) && y > (point3.y - 20)) {
invalidateCanvas(event, point3);
}
}
return true;
}
private void invalidateCanvas(MotionEvent event, PointF point) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
point.set(event.getX(), event.getY());
invalidate();
}
if (event.getAction() == MotionEvent.ACTION_MOVE) {
point.set(event.getX(), event.getY());
invalidate();
}
if(event.getAction() == MotionEvent.ACTION_UP) {
invalidate();
}
}
}
代码无效。当我点击点并想移动它时,它没有移动。当我删除 if((point.x) == x || (point.y) == y)
检查时我可以移动点,但是当我删除检查时所有点一起移动。所以我只想拖一个点。
例如,如果我触摸 point1
,我只想移动 point1
,仅此而已。当我点击 point2
时,我只想移动 point2.
我该怎么做?
如果您有 1 个像素大小的手指并且您能够触摸到您放置点的确切位置,那么您的代码基本上没问题。 :)
因此,您必须围绕点引入一个逻辑区域并使用它们。例如,圆圈可以很好地表示点。如果您触摸屏幕并获得 x
、y
坐标,您只需检查哪个点是最近的点并检查距离。
步骤:
如果event.getAction() == MotionEvent.ACTION_DOWN
为真:
- 你会检查哪个点是在 10dp(逻辑圆的半径)内最近的点
- 如果你找到它,你会保存为最后一个参考点,以了解哪个处于移动状态
Elseif event.getAction() == MotionEvent.ACTION_MOVE
为真:
- 如果你保存了移动中的参考点,则改变该点的坐标并使其失效UI
Elseif event.getAction() == MotionEvent.ACTION_UP
为真:
- 您清除保存的参考点,拖动结束
我有 canvas 和 3 个要在触摸事件上拖动的点。这是我的代码。
public class Canvas7 extends View {
Paint p;
PointF point1;
PointF point2;
PointF point3;
public Canvas7(Context context) {
super(context);
p = new Paint(Paint.ANTI_ALIAS_FLAG);
p.setStrokeWidth(3);
point1 = new PointF(150, 200);
point2 = new PointF(150, 500);
point3 = new PointF(250, 300);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawARGB(80, 102, 204, 255);
p.setStyle(Paint.Style.FILL);
p.setColor(Color.GREEN);
canvas.drawCircle(point1.x, point1.y, 10, p);
p.setStyle(Paint.Style.FILL);
p.setColor(Color.BLUE);
canvas.drawCircle(point2.x, point2.y, 10, p);
canvas.drawCircle(point3.x, point3.y, 10, p);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
if (x > 0 && y > 0) {
if ((x < (point1.x + 20) && x > (point1.x - 20)) && (y < (point1.y + 20)) && y > (point1.y - 20)) {
invalidateCanvas(event, point1);
} else if ((x < (point2.x + 20) && x > (point2.x - 20)) && (y < (point2.y + 20)) && y > (point2.y - 20)) {
invalidateCanvas(event, point2);
} else if ((x < (point3.x + 20) && x > (point3.x - 20)) && (y < (point3.y + 20)) && y > (point3.y - 20)) {
invalidateCanvas(event, point3);
}
}
return true;
}
private void invalidateCanvas(MotionEvent event, PointF point) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
point.set(event.getX(), event.getY());
invalidate();
}
if (event.getAction() == MotionEvent.ACTION_MOVE) {
point.set(event.getX(), event.getY());
invalidate();
}
if(event.getAction() == MotionEvent.ACTION_UP) {
invalidate();
}
}
}
代码无效。当我点击点并想移动它时,它没有移动。当我删除 if((point.x) == x || (point.y) == y)
检查时我可以移动点,但是当我删除检查时所有点一起移动。所以我只想拖一个点。
例如,如果我触摸 point1
,我只想移动 point1
,仅此而已。当我点击 point2
时,我只想移动 point2.
我该怎么做?
如果您有 1 个像素大小的手指并且您能够触摸到您放置点的确切位置,那么您的代码基本上没问题。 :)
因此,您必须围绕点引入一个逻辑区域并使用它们。例如,圆圈可以很好地表示点。如果您触摸屏幕并获得 x
、y
坐标,您只需检查哪个点是最近的点并检查距离。
步骤:
如果
event.getAction() == MotionEvent.ACTION_DOWN
为真:- 你会检查哪个点是在 10dp(逻辑圆的半径)内最近的点
- 如果你找到它,你会保存为最后一个参考点,以了解哪个处于移动状态
Elseif
event.getAction() == MotionEvent.ACTION_MOVE
为真:- 如果你保存了移动中的参考点,则改变该点的坐标并使其失效UI
Elseif
event.getAction() == MotionEvent.ACTION_UP
为真:- 您清除保存的参考点,拖动结束