2013-07-01 11 views
8

Sto provando a realizzare una semplice app solo per capire meglio come utilizzare gli eventi Touch su Android. In questo momento, la mia attività sposta semplicemente un ImageView alle coordinate del tocco sullo schermo (le coordinate di MotionEvent). Riuscivo a farlo applicando un semplice trucco per impostare la nuova posizione dell'immagine ad un valore che è fatto di tocco coordinate relative alla posizione dell'immagine (getX() e getY()). I dx e dy variabili sono responsabili per memorizzare questo relativi valori in modo che il tocco mantiene costante all'interno dell'immagine.Perché i getX, getY, setX e setY di ImageView non rappresentano il valore reale nel layout relativo?

Ora voglio inserire 2 ImageViews nell'attività e ho solo due punti fissi per ImageViews e una volta che l'utente trascina un ImageView sull'altro centro di ImageView, le due immagini si posizionano, ma per farlo correttamente mi piacerebbe ottieni le coordinate reali del centro dell'immagine. Ho commentato le parti del codice che lo fanno funzionare correttamente per mostrare il problema. Come si può vedere nella prima immagine quando viene creata la vista, le coordinate immagine sono semplicemente (0, 0), non importa dove si è (fino a quando la posizione iniziale è definito come un parametro di layout come CENTER_IN_PARENT).

Come si può vedere nella seconda fotoe per quanto ho osservato ImageView di getX() e getY() ritorno la coordinata come se l'angolo superiore sinistro dell'immagine era in alto a sinistra del display quando l'immagine si trova nell'angolo in alto a sinistra della finestra di ATTIVITÀ.

Mi piacerebbe capire perché succede e se qualcuno sa come ottenere effettivamente le coordinate di ImageView che può essere confrontato direttamente con le coordinate di MotionEvent.


Immagini:

FIRST PICTURE

SECOND PICTURE

risposta

13

Io ancora non so esattamente perché getX(), getY(), setX(), e setY() non rappresentano la posizione della visualizzazione sullo schermo , ma ho capito come ottenere la posizione effettiva degli oggetti vista sullo schermo: getLocationOnScreen(coordinates). Dove coordinates è un array int 2 posizioni (int [2]).

Ad esempio, per ottenere il corrispondente valore reale verso l'angolo in alto a sinistra del mio ImageView image ho semplicemente bisogno di fare qualcosa di simile:

int[] img_coordinates = new int[2]; 
ImageView image = (ImageView) findViewById(R.id.myImage); 

image.getLocationOnScreen(img_coordinates); 

e poi posso davvero confrontare questi coordinate con linee laterali getRawX e getRawY dell'evento.

Se voglio ottenere il punto centrale del mio punto di vista ho solo bisogno di fare questo:

x_center = (double)img_coordinates[0] + image.getWidth()/2.0; 
y_center = (double)img_coordinates[1] + image.getHeight()/2.0; 

Spero che questo aiuta altre persone troppo, ci ho messo un po 'a trovare questo approccio e sono in realtà Non sono sicuro che sia l'approccio migliore ma fa il trucco per me.

Problemi correlati