Rysowanie linii po palcu - motionevent.getX () i getY () niepoprawna UPDATE

AKTUALIZACJA: przeczytaj jeszcze raz całe pytanie :-)

Tło:

Stworzyłem siatkę kropek, tworząc widok niestandardowy, a następnie dodając te widoki doTableLayout. Celem jest dla mnie, aby móc narysować linię od jednej z tych kropek do innej kropki w taki sposób, aby po naciśnięciu kropki rozpoczynała się linia od środka wciśniętej kropki do punktu, w którym palec jest obecnie wzruszające. Gdy palec jest przeciągany po innej kropce, linia kończy się w środku tej kropki. Wynikiem jest linia narysowana od środka wciśniętej kropki do środka kropki, która została przeciągnięta przez palec.

Aby utworzyć linię przechodzącą przezTableLayout, Stworzyłem nowy widok niestandardowy, który właśnie utworzył linię między punktami za pomocącanvas.drawLine() metoda. Potem stworzyłemFrameLayout w którym umieściłem TableLayout i LineView. Oznaczało to, że widok linii mógłby zostać narysowany na wierzchu TableLayout.

Obecna sytuacja:

Dodałem detektor dotykowy w klasie DotView, aby mógł mieć własne „sprzężenie dotykowe”. W działaniu jest też inny słuchacz dotykowy, którego próbuję użyć, aby uzyskać punkty potrzebne do narysowania linii. Słuchacze dotykowe działają dobrze, o ile wiem - nie przeszkadzają sobie nawzajem.

Problem polega na uzyskaniu prawidłowych współrzędnych do wykreślenia linii. Próbowałem wielu sposobów, aby uzyskać współrzędne środka kropki, która została naciśnięta (punkt początkowy linii), ale nadal jej nie zarządzałem. To pytanie ma więcej informacji:Uzyskaj współrzędne środka widoku . Druga część to uzyskanie poprawnego punktu końcowego linii. Na potrzeby tego pytania chciałbym, aby koniec linii podążał za pozycją palca. Myślałem, że to takie prostemotionevent.getX() / getY() ale to nie zadziałało. Zamiast tego nastąpiło pomieszanie współrzędnych na skali względem układu kropki i współrzędnych względem całego układu / ekranu.

Mówiąc najprościej: wartości getX () i getY () są niepoprawne i właśnie tutaj próbuję je rozwiązać.

Jak pokazano na zrzutach ekranu, kiedy naciskam kropkę, punkt początkowy linii jest mniej więcej we właściwym miejscu, ale punkt końcowy jest daleko. Naprawdę nie potrafię wyjaśnić dlaczego.

próbowałemgetRawX() igetRawY() i zwracają bardziej dokładne wartości, ale nadal są niepoprawne przez ilość dopełnienia (lub coś w tym stylu - nie rozumiem w 100%).

To pokazuje mój kod

W moimActivity :

    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;
    }

I wreszcieLineView:

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);

}

UWAGI:

Dzwonię do lewego górnego punktu"dot 1".

Zrzuty ekranu mogą nie być całkowicie dokładne, ponieważ mój palec porusza się lekko, gdy robię zrzut ekranu, ale opisywane przeze mnie zachowanie ma miejsce.

Jeśli chcesz uzyskać inne informacje / kod, z przyjemnością je przedstawię.

Dziękujemy za poświęcenie czasu na przeczytanie tego - przepraszam, że jest tak długo!

questionAnswers(1)

yourAnswerToTheQuestion