2016-03-08 18 views
9

Ho una tela su cui ho impostato un percorsoAggiunta touchListener per oggetto tracciato

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

canvas.drawPath(path,p); 

Ora voglio implment un tocco ascoltatore a questo oggetto percorso.

Ho implementato l'opzione di zoom su un ImageView personalizzato e disegno queste linee su una tela nel metodo onDraw di questo ImageView personalizzato. Quindi non posso farlo controllando le coordinate in cui l'utente ha toccato.

So che l'oggetto percorso non è un figlio di View Class e quindi non posso implementare un TouchListner in esso. Ma la cosa di cui ho esattamente bisogno è qualcosa come

path.setOnTouchListener(myTouchListner); 

Qualcuno ha qualche idea su come implementarlo? Qualsiasi aiuto è apprezzato.

+1

Si prega di consultare: http://stackoverflow.com/questions/9588003/android-how-to-check-if-a-path-taintain-touched-point –

+0

@DucNguyen Che non mi serve :( –

+0

Sembrerebbe che il collegamento di Duc costituisca la base della soluzione – CommonsWare

risposta

1

Non c'è nulla di simile. Il percorso è solo una struttura dati, il modo in cui lo usi (disegno, clip, ...) non ha nulla a che fare con esso. E così sono gli eventi tattili.

Hai solo bisogno di fare un po 'di matematica con le coordinate toccanti. È una trasformazione 2D usando una matrice. Puoi leggere questo on wikipedia.

Per prima cosa è necessario associare il punto di tocco alle coordinate ingrandite/panoramiche, dare un'occhiata a here, here e here.

Non ho provato, ma se avete un ImageView questo metodo dovrebbe fare:

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

Non posso dire se questo funzionerà out of the box per voi, perché io non so cosa uso del Sentiero che hai, posso solo supporre che tu lo usi per disegnare sopra la tua immagine. Se si applica qualsiasi altra trasformazione prima di tracciare il percorso, è necessario utilizzare la trasformazione applicata al percorso.

Se fate quelli trasformazione sulla tela è possibile estrarre la matrice in questo modo:

Matrix matrix = canvas.getMatrix() 

Un altro percorso è quello di estrarre i valori di matrice in un array e fare il calcolo da soli:

// 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] e values[5] sono le coordinate x,y dell'angolo in alto a sinistra dell'elemento trasformato, indipendentemente dal fattore di zoom
  • values[0] e values[4] sono i fattori di zoom rispettivamente per la larghezza e l'altezza dell'elemento trasformato. Se si esegue lo zoom con lo stesso fattore, entrambi dovrebbero avere lo stesso valore.

Quando finalmente convertito il vostro punto di contatto nel Path sistema è possibile controllare se è dentro il percorso utilizzando this metodo qualcun altro già suggerito nei commenti della sua domanda di coordinate.

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

Tu sei l'unico a conoscere il codice di cui si sta lavorando e quindi come coordinare il percorso di sistema si trasforma nella vista e quindi l'unico che può sapere come convertire correttamente indietro. Quindi non pensare a questa risposta come codice drop-in. Ti ho solo indicato nella direzione. Potrebbe essere utile stampare un log della coordinata/conversione touch per eseguire il debug durante lo sviluppo.

Buona fortuna.

+0

Ok. L'unica cosa che posso fare qui è alcuni calcoli manuali, e ho capito. Riesco a trovare la distanza tra il punto in cui è stato toccato l'uso e la linea che ho disegnato. Ad ogni modo sarà molto utile se Google implementa qualcosa come path.onTouchListner(). :). Grazie per la guida. –

+0

Non possono fare una cosa del genere. È una struttura dati. È come avere un oggetto Map e volere un onTouchListener su di esso :) –

+0

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

1

Può superare la onTouchEvent(). Trova le coordinate che hai toccato, controllare se la partite coordinata con il vostro percorso., Se non attivare la funzione ..

controlli prego sotto per i dettagli REFERENCE

+0

Non riesco a ottenere le coordinate corrette poiché ho implementato l'opzione di zoom nella vista di immagini con un SimpleOnScaleGestureListener. Ho un fattore di scala mScaleFactor = Math.max (0.1f, Math .min (mScaleFactor, 5.0f)), nel metodo onScale (ScaleGestureDetector). –

+0

ah sry non ha visto quella parte nella tua domanda –

+1

"Non riesco a ottenere le coordinate corrette da quando ho implementato l'opzione di zoom nell'immagini" - tu dovrà eseguire autonomamente i calcoli, quindi, per convertire dalla coordinata touch alle coordinate effettive s descrizione della tua immagine in scala. – CommonsWare

Problemi correlati