Как получить контакт для конкретного элемента в точке холста - PullRequest
0 голосов
/ 18 мая 2019

У меня есть холст и 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, я хочу переместить только точку2.

Как я могу это сделать?

1 Ответ

2 голосов
/ 18 мая 2019

Ваш код в основном хорош, если у вас есть пальцы размером 1 пиксель, и вы можете коснуться точного положения, в котором вы поместили точку. :)

Итак, вы должны ввести логическую область вокруг точек и работать с ними. Например, круг - это хорошее представление для очков. Если вы касаетесь экрана и получаете координаты x, y, вам просто нужно проверить, какая точка является ближайшей, а также проверить расстояние.

Шаги:

  1. Если event.getAction() == MotionEvent.ACTION_DOWN истинно:

    • Вы бы проверили, какая точка является ближайшей в пределах 10dp (радиус логического круга)
    • Если вы нашли его, вы бы сохранили его в качестве последней контрольной точки, чтобы узнать, что находится в состоянии движения
  2. Elseif event.getAction() == MotionEvent.ACTION_MOVE верно:

    • Если вы сохранили опорную точку, которая находится в движении, измените координаты точки и лишите законной силы пользовательский интерфейс
  3. Elseif event.getAction() == MotionEvent.ACTION_UP верно:

    • Вы очищаете сохраненную контрольную точку, перетаскивание закончено
...