2016-03-08 4 views
9

Ich habe eine Leinwand, auf die ich einen Pfad gesetztHinzufügen von Touch zu Pfadobjekt

Path path = new Path(); 
path.moveTo(1, 1); 
path.lineTo(90, 1); 
path.lineTo(90, 60); 
path.lineTo(1, 60); 

canvas.drawPath(path,p); 

Jetzt i einen Hauch Zuhörer auf diesen Pfad Objekt implment will.

Ich habe eine Zoom-Option für ein benutzerdefiniertes ImageView implementiert und zeichne diese Linien über einen Canvas in der onDraw-Methode dieses benutzerdefinierten ImageView. Also kann ich es nicht tun, indem ich die Koordinaten überprüfe, die der Benutzer berührt hat.

Ich weiß, dass das Pfadobjekt kein Kind der View-Klasse ist und daher kann ich keinen TouchListner darin implementieren. Aber die Sache, die ich genau brauche, ist so etwas wie

path.setOnTouchListener(myTouchListner); 

Hat jemand eine Idee darüber, wie es zu implementieren? Jede Hilfe wird geschätzt.

+1

Überprüfen Sie bitte unter: http://StackOverflow.com/Questions/9588003/android-how-to-check-if-a-path-contains-touched-point –

+0

@DucNguyen Das tut nicht meine Notwendigkeit :( –

+0

Es scheint sicherlich, dass Ducs Link die Basis für die Lösung ist – CommonsWare

Antwort

1

Es gibt nicht so etwas. Der Pfad ist nur eine Datenstruktur, wie Sie sie verwenden (zeichnen, clip, ...) hat damit nichts zu tun. Und so sind Berührungsereignisse.

Sie müssen nur etwas Mathe mit den berührenden Koordinaten tun. Es ist eine 2D-Transformation mit einer Matrix. Sie können darüber lesen on wikipedia.

Zuerst sollten Sie den Berührungspunkt den gezoomten/geschwenkten Koordinaten zuordnen, siehe here, here und here10.

ich nicht getestet haben, aber wenn Sie ein Image diese Methode tun soll:

final float[] getPointerCoords(ImageView view, MotionEvent e) 
{ 
    final int index = e.getActionIndex(); 
    final float[] coords = new float[] { e.getX(index), e.getY(index) }; 
    Matrix matrix = new Matrix(); 
    // invert compute the inverse transformation matrix 
    view.getImageMatrix().invert(matrix); 
    // this adjust the panning 
    matrix.postTranslate(view.getScrollX(), view.getScrollY()); 
    // this apply the inverse transformation to your touch points 
    // which should give you the coordinates on your imageview 
    matrix.mapPoints(coords); 
    return coords; 
} 

Ich kann Ihnen nicht sagen, ob dies für Sie aus dem Kasten heraus arbeiten, weil ich weiß nicht, was die Verwendung von dem Pfad, den du hast, kann ich nur annehmen, dass du ihn benutzt, um über dein Bild zu zeichnen. Wenn Sie vor dem Zeichnen des Pfads eine andere Transformation anwenden, sollten Sie stattdessen die auf den Pfad angewendete Transformation verwenden.

Wenn Sie diese Transformation auf der Leinwand tun können Sie die Matrix wie folgt extrahieren:

Matrix matrix = canvas.getMatrix() 

Ein anderer Weg ist, um die Matrixwerte in ein Array zu extrahieren und tun, um die Berechnung selbst:

// Get the values of the matrix 
// create this array in a field an reuse it for performances 
float[] values = new float[9]; 
matrix.getValues(values); 
  • values[2] und values[5] sind die x,y Koordinaten der oberen linken Ecke des transformierten Elements, unabhängig vom Zoomfaktor
  • values[0] und values[4] sind die Zoomfaktoren für die Breite und Höhe des transformierten Elements. Wenn Sie mit dem gleichen Faktor zoomen, sollten beide den gleichen Wert haben.

Wenn Sie schließlich Ihren Berührungspunkt in die Path Koordinatensystem umgewandelt Sie überprüfen können, ob es sonst schon in den Kommentaren der Frage vorgeschlagen in dem Pfad mit this Methode jemand ist.

if (path.contains(coordX, coordY)) { 
    // inside 
} else { 
    // outside 
} 

Sie sind der einzige, den Code zu kennen Sie mit und so arbeiten, wie der Pfad Koordinatensystem in der Ansicht transformiert wird und damit die einzige Person, die wissen kann, wie man richtig zurück zu konvertieren. Denken Sie also nicht an diese Antwort als Drop-In-Code. Ich habe dich nur in die Richtung gezeigt. Es kann hilfreich sein, ein Protokoll der Touch-Koordinaten/-Konvertierung zu drucken, um es während der Entwicklung zu debuggen.

Viel Glück.

+0

Ok. Das einzige, was ich hier tun kann, sind einige manuelle Berechnungen, und ich habe es. Ich kann den Abstand zwischen dem Punkt, an dem sich der Benutzer berührte, und der Linie, die ich gezeichnet habe, finden. Wie auch immer, es wird sehr hilfreich sein, wenn Google etwas wie path.onTouchListner() implementiert. :). Danke für die Anleitung. –

+0

Sie können so etwas nicht tun. Es ist eine Datenstruktur. Es ist wie mit einem Map-Objekt und einem onTouchListener :) –

+0

okok ....... (y) –

1

Können Sie die onTouchEvent() überfahren. Finden die Koordinaten Sie berührt haben, überprüfen, ob die Streichhölzer koordinieren mit Ihrem Weg. Wenn sie Ihre Funktion auslöst ..

Bitte überprüfen Sie unten für Detail REFERENCE

+0

Ich kann nicht die richtigen Koordinaten erhalten, da ich Zoom-Option in der Bildansicht mit einem SimpleOnScaleGestureListener implementiert habe.Ich habe einen Skalierungsfaktor mScaleFactor = Math.max (0,1f, Math .min (mScaleFactor, 5.0f)); in der Methode onScale (ScaleGestureDetector detector) –

+0

ah sry hat diesen Teil in Ihrer Frage nicht gefunden –

+1

"Ich kann die richtigen Koordinaten nicht finden, da ich die Zoomoption im Bildfenster implementiert habe" - Sie muss die Berechnungen selbst ausführen, um dann von der Berührungskoordinate in die effektive Koordinate s zu konvertieren System Ihres skalierten Bildes. – CommonsWare