Рисование линии следующим пальцем - motionevent.getX () и getY () неверное ОБНОВЛЕНИЕ

ОБНОВЛЕНИЕ: пожалуйста, прочитайте весь вопрос снова :-)

Фон:

Я создал сетку точек, создав пользовательский вид, а затем добавив эти виды вTableLayout, Цель состоит в том, чтобы я смог нарисовать линию от одной из этих точек до другой точки таким образом, чтобы при нажатии точки линия начиналась от центра нажатой точки до точки, где в данный момент находится палец. трогательный. Когда палец перетаскивается на другую точку, линия заканчивается в центре этой точки. В результате получается линия, проведенная от центра нажатой точки к центру точки, которую перетащил палец.

Чтобы создать линию, проходящую черезTableLayout, Я создал новый пользовательский вид, который просто создал линию между точками сcanvas.drawLine() метод. Затем я создалFrameLayout в котором я положил TableLayout и LineView. Это означало, что вид линии может быть нарисован поверх TableLayout.

Текущая ситуация:

Я добавил сенсорный слушатель в класс DotView, чтобы он мог иметь свой собственный «сенсорный отзыв », В упражнении есть еще один сенсорный слушатель, которого я пытаюсь использовать, чтобы получить точки, необходимые для подведения черты. Насколько я могу судить, сенсорные слушатели работают нормально - они не мешают друг другу.

Проблема в получении правильных координат для построения линии. Я пробовал несколько способов получить координаты центра точки, которая была нажата (начальная точка линии), но мне все еще не удалось это. Этот вопрос, имеет больше информации:Получить координаты центра вида , Вторая часть - это получение правильной конечной точки линии. Для целей этого вопроса я бы хотел, чтобы конец строки следовал за положением пальца. Я думал, что это так же просто, какmotionevent.getX() / getY() но это еще нет работал. Вместо этого произошло то, что между координатами в масштабе относительно макета точки и координатами относительно всего макета / экрана произошла путаница.

Проще говоря: значения getX () и getY () неверны, и это то, что я пытаюсь решить здесь.

Как показано на скриншотах, когда я нажимаю на точку, начальная точка линии находится примерно в правильном месте, но конечная точка находится далеко. Я могу'действительно объясняю почему.

я пыталсяgetRawX() а такжеgetRawY() и они возвращают гораздо более точные значения, но они все еще неверны по количеству заполнения (или что-то в этом роде - я нет 100% понимаю).

Это показывает мой код

В моем :Activity

    LineView test;
    FrameLayout fl;
     float startPointX = 0;
    float startPointY = 0;

    // Removed 

    @Override
    public boolean onTouch(View view, MotionEvent event) {

        float eventX = event.getX();
        float eventY = event.getY();

        int[] loc = new int[2];

        switch (event.getAction()) {

        case MotionEvent.ACTION_DOWN:

            if (view instanceof DotView) {

                DotView touchedDv = (DotView) view;

                int dotColor = touchedDv.getColor();
                test.setColor(dotColor);

                float[] f = touchedDv.getDotCenterLocationOnScreen();
                startPointX = f[0];
                startPointY = f[1];

                test.setPoints(startPointX, startPointY, eventX, eventY);
fl.addView(test);
            }

            vib.vibrate(35);


            return false; 
        case MotionEvent.ACTION_MOVE:

            test.setPoints(startPointX, startPointY, eventX, eventY);

            break;
        case MotionEvent.ACTION_UP:

            fl.removeView(test);

            return false;

        default:
            return false;
        }

        return true;
    }

И наконец то:LineView

public class LineView extends View {

public static final int LINE_WIDTH = 10;
Paint paint = new Paint();

float startingX, startingY, endingX, endingY;

public LineView(Context context) {
    super(context);

    paint.setColor(Color.MAGENTA);
    paint.setStrokeWidth(LINE_WIDTH);

}

public void setPoints(float startX, float startY, float endX, float endY) {

    startingX = startX;
    startingY = startY;
    endingX = endX;
    endingY = endY;
            invalidate();
}


@Override
public void onDraw(Canvas canvas) {

    canvas.drawLine(startingX, startingY, endingX, endingY, paint);

}

ЗАМЕТКИ:

Я звоню в верхнюю левую точку."dot 1"

Снимки экрана могут быть не совсем точными, так как мой палец слегка двигается, когда я делаю снимок экрана, но описанное мной поведение происходит.

Если понадобится любая другая информация / код, я с радостью предоставлю ее.

Спасибо, что нашли время, чтобы прочитать это - извините, это так долго!

Ответы на вопрос(1)

Ваш ответ на вопрос