Zeichnen einer Linie nach finger - motionevent.getX () und getY () falsches UPDATE

UPDATE: Bitte lies die ganze Frage nochmal durch :-)

Hintergrund:

Ich habe ein Raster mit Punkten erstellt, indem ich eine benutzerdefinierte Ansicht erstellt und diese Ansichten dann zu einer hinzugefügt habeTableLayout. Das Ziel ist, dass ich in der Lage bin, eine Linie von einem dieser Punkte zu einem anderen Punkt so zu zeichnen, dass beim Drücken eines Punkts eine Linie von der Mitte des gedrückten Punkts bis zu dem Punkt beginnt, an dem sich der Finger gerade befindet berühren. Wenn der Finger über einen anderen Punkt gezogen wird, endet die Linie in der Mitte dieses Punkts. Das Ergebnis ist eine Linie, die von der Mitte des gedrückten Punkts zu der Mitte des Punkts gezogen wird, über den der Finger gezogen wurde.

So erstellen Sie eine Linie über dieTableLayoutIch habe eine neue benutzerdefinierte Ansicht erstellt, in der nur eine Linie zwischen Punkten mit dem Symbol erstellt wurdecanvas.drawLine() Methode. Ich habe dann eineFrameLayout in das ich das TableLayout und das LineView stecke. Dies bedeutete, dass die Linienansicht über dem TableLayout gezeichnet werden konnte.

Momentane Situation:

Ich habe der DotView-Klasse einen Touch-Listener hinzugefügt, damit er über ein eigenes „Touch-Feedback“ verfügt. Es gibt auch einen anderen Touch-Listener in der Aktivität, den ich verwenden möchte, um die Punkte zu erhalten, die zum Zeichnen der Linie erforderlich sind. Die Touch-Listener funktionieren soweit ich das beurteilen kann einwandfrei - sie stören sich nicht.

Das Problem besteht darin, die richtigen Koordinaten zum Zeichnen der Linie zu ermitteln. Ich habe eine Reihe von Möglichkeiten ausprobiert, um die Koordinaten des Mittelpunkts des gedrückten Punkts (des Startpunkts der Linie) zu ermitteln, habe es aber immer noch nicht geschafft. Diese Frage enthält weitere Informationen:Abrufen der Koordinaten des Mittelpunkts einer Ansicht . Der zweite Teil ermittelt den richtigen Endpunkt der Linie. Für die Zwecke dieser Frage möchte ich nur, dass das Ende der Linie der Position des Fingers folgt. Ich fand es so einfach wiemotionevent.getX() / getY() aber das hat nicht funktioniert. Stattdessen kam es zu einer Verwechslung der Koordinaten auf einer Skala in Bezug auf das Layout des Punkts und der Koordinaten in Bezug auf das gesamte Layout / den gesamten Bildschirm.

Einfach ausgedrückt: Die Werte getX () und getY () sind falsch, und das ist, was ich hier zu lösen versuche.

Wie in den Screenshots gezeigt, befindet sich der Startpunkt der Linie ungefähr an der richtigen Stelle, wenn ich auf einen Punkt drücke, aber der Endpunkt ist weit entfernt. Ich kann nicht wirklich erklären, warum.

Ich habe versuchtgetRawX() undgetRawY() und sie geben viel genauere Werte zurück, aber sie sind immer noch falsch in Bezug auf das Auffüllen (oder so ähnlich - ich verstehe es nicht zu 100%).

Das zeigt meinen Code

In meinemActivity :

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

Und zum Schluss dieLineView:

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

}

ANMERKUNGEN:

Ich rufe den Punkt oben links an"dot 1".

Die Screenshots sind möglicherweise nicht ganz korrekt, da sich mein Finger beim Aufnehmen des Screenshots leicht bewegt, aber das von mir beschriebene Verhalten tritt auf.

Wenn andere Informationen / Codes gewünscht werden, werde ich diese gerne zur Verfügung stellen.

Vielen Dank, dass Sie sich die Zeit genommen haben, dies zu lesen - es tut uns leid, dass es so lange dauert!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage