Sto cercando di ottenere le coordinate pixel dello schermo assoluto nell'angolo in alto a sinistra di una vista. Tuttavia, tutti i metodi che riesco a trovare, ad esempio getLeft()
e getRight()
, non funzionano in quanto sembrano tutti relativi al genitore della vista, quindi mi danno 0
. Qual è il modo corretto per farlo?Come ottenere le coordinate assolute di una vista
Se aiuta, questo è per un gioco "rimetti ordine in ordine". Voglio che l'utente sia in grado di disegnare una casella per selezionare più pezzi. La mia ipotesi è che il modo più semplice per farlo sia getRawX()
e getRawY()
dal MotionEvent
e quindi confrontare questi valori con l'angolo in alto a sinistra del layout che contiene i pezzi. Conoscendo la dimensione dei pezzi, posso determinare quanti pezzi sono stati selezionati. Mi rendo conto che posso usare getX()
e getY()
su MotionEvent
, ma come quello restituisce una posizione relativa che rende determinante quali pezzi sono stati selezionati più difficili. (Non impossibile, lo so, ma sembra inutilmente complicato).
Modifica: questo è il codice che ho utilizzato per cercare di ottenere le dimensioni del contenitore di attesa, come da una delle domande. TableLayout
è il tavolo che contiene tutti i pezzi del puzzle.
TableLayout tableLayout = (TableLayout) findViewById(R.id.tableLayout);
Log.d(LOG_TAG, "Values " + tableLayout.getTop() + tableLayout.getLeft());
Modifica 2: Ecco il codice che ho provato, seguendo più delle risposte suggerite.
public int[] tableLayoutCorners = new int[2];
(...)
TableLayout tableLayout = (TableLayout) findViewById(R.id.tableLayout);
tableLayout.requestLayout();
Rect corners = new Rect();
tableLayout.getLocalVisibleRect(corners);
Log.d(LOG_TAG, "Top left " + corners.top + ", " + corners.left + ", " + corners.right
+ ", " + corners.bottom);
cells[4].getLocationOnScreen(tableLayoutCorners);
Log.d(LOG_TAG, "Values " + tableLayoutCorners[0] + ", " + tableLayoutCorners[1]);
Questo codice è stato aggiunto dopo che è stata eseguita l'inizializzazione. L'immagine è stata divisa in una serie di ImageViews (le celle [] array) contenute in un TableLayout
. Celle [0] è in alto a sinistra ImageView
e ho selezionato celle [4] poiché si trova da qualche parte nel mezzo e sicuramente non dovrebbero avere le coordinate di (0,0).
Il codice sopra riportato mi dà ancora tutti gli 0 nei log, che in realtà non capisco perché i vari pezzi del puzzle sono visualizzati correttamente. (Ho provato public int per tableLayoutCorners e visibilità predefinita, dando entrambi lo stesso risultato.)
Non so se questo è significativo, ma gli ImageView
non hanno inizialmente una dimensione. La dimensione di ImageView
s viene determinata automaticamente durante l'inizializzazione dalla vista quando viene visualizzata un'immagine da visualizzare. Questo potrebbe contribuire al fatto che i loro valori siano 0, anche se quel codice di registrazione è dopo che è stata loro assegnata un'immagine e si sono ridimensionati automaticamente? Per contrastarlo, ho aggiunto il codice tableLayout.requestLayout()
come mostrato sopra, ma non è stato d'aiuto.
Ora che è il tipo di funzione I dovrebbe trovare Sfortunatamente, non devo usarlo correttamente. Mi rendo conto che è stato un bug noto che getLocationOnScreen fornisce un'eccezione di puntatore nullo in Android v1.5 (la piattaforma che sto codificando per), ma i test in v2.1 non hanno funzionato meglio. Entrambi i metodi mi hanno dato 0 per tutto. Ho incluso uno snippet di codice sopra. –
È possibile solo richiamarlo * AFTER * è stato eseguito il layout. Stai chiamando il metodo prima che le viste siano posizionate sullo schermo. –
Aha, hai ragione anche se non era ovvio che lo stavo facendo. Grazie! Per chiunque sia curioso di avere maggiori dettagli, ho aggiunto una risposta che spiega cosa intendo. –