2011-11-03 12 views
10

Contesto: Ho un ImageView che ho modificato per essere scorrevole (trascina) e zoomabile (zoom pizzico). Ho usato la tecnica esatta menzionata nel libro di terza edizione "Hello, Android" che può anche essere trovato here. Questa tecnica utilizza la trasformazione della matrice per gestire sia lo scorrimento che lo zoom.Android ImageView - Ottieni le coordinate di tap (clic) indipendentemente dalla posizione dello scroll o dalla scala dello zoom

mio problema: Quando un utente tocca sull'immagine, voglio le coordinate di quella del rubinetto in relazione alla immagine stessa, indipendentemente da come l'immagine è stata ingrandita o scorrere. Ad esempio, se la mia immagine è 1000x2000 e faccio scorrere e zoomare l'immagine. Poi tocco l'immagine ad un certo punto, voglio sapere che cosa è in relazione al 1000x2000, non solo all'area dello schermo. Come posso fare questo?

risposta

29

Ho trovato una soluzione a questo utilizzando bit di informazioni che ho messo insieme da altre domande su questo sito. Per restituire alla comunità, ho pensato che fosse giusto condividere ciò che ho imparato. Spero che questo aiuta qualcuno:

// Get the values of the matrix 
float[] values = new float[9]; 
matrix.getValues(values); 

// values[2] and values[5] are the x,y coordinates of the top left corner of the drawable image, regardless of the zoom factor. 
// values[0] and values[4] are the zoom factors for the image's width and height respectively. If you zoom at the same factor, these should both be the same value. 

// event is the touch event for MotionEvent.ACTION_UP 
float relativeX = (event.getX() - values[2])/values[0]; 
float relativeY = (event.getY() - values[5])/values[4]; 

Grazie a queste fonti: source 1 e source 2

+0

può si prega di inviare come viene calcolato il fattore di zoom? Mi piacerebbe capire se potrebbe essere sia più piccolo che più grande di 1 (ovviamente non allo stesso tempo ...). – Matteo

+0

Così utile per me. Complimenti! –

+3

"' Spero che questo aiuti qualcuno "- assolutamente – topher

2

È inoltre possibile calcolare la matrice inversa e utilizzare le mapPoints() metodo:

// Get the inverse matrix 
Matrix inverseMatrix = new Matrix(); 
matrix.invert(inverseMatrix); 

// Transform to relative coordinates 
float[] point = new float[2]; 
point[0] = e.getX(); 
point[1] = e.getY(); 
inverseMatrix.mapPoints(point); 
Problemi correlati