首页 > 解决方案 > 如何触摸画布点中的特定项目

问题描述

我有画布和 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。

我怎样才能做到这一点?

标签: androidandroid-canvaspointontouchlistener

解决方案


如果您有 1 个像素大小的手指并且您能够触摸放置点的确切位置,那么您的代码基本上没问题。:)

因此,您必须在点周围引入一个逻辑区域并使用它们。例如,圆圈是点的良好表示。如果您触摸屏幕并获得x,y坐标,您只需检查哪个点是最近的点并检查距离。

脚步:

  1. 如果event.getAction() == MotionEvent.ACTION_DOWN是真的:

    • 您将检查哪个点是 10dp(逻辑圆的半径)内最近的点
    • 如果找到它,您将保存为最后一个参考点以了解哪个处于移动状态
  2. 埃尔塞夫event.getAction() == MotionEvent.ACTION_MOVE是真的:

    • 如果您保存了正在移动的参考点,则更改该点的坐标并使 UI 无效
  3. 埃尔塞夫event.getAction() == MotionEvent.ACTION_UP是真的:

    • 你清除保存的参考点,拖动结束

推荐阅读