Puis-je obtenir la position x et y d'une vue par rapport à la disposition racine de mon activité dans Android?
142
Puis-je obtenir la position x et y d'une vue par rapport à la disposition racine de mon activité dans Android?
C'est une solution, cependant, puisque les API changent avec le temps et qu'il peut y avoir d'autres façons de le faire, assurez-vous de vérifier les autres réponses. L'un prétend être plus rapide et un autre prétend être plus facile.
private int getRelativeLeft(View myView) {
if (myView.getParent() == myView.getRootView())
return myView.getLeft();
else
return myView.getLeft() + getRelativeLeft((View) myView.getParent());
}
private int getRelativeTop(View myView) {
if (myView.getParent() == myView.getRootView())
return myView.getTop();
else
return myView.getTop() + getRelativeTop((View) myView.getParent());
}
Faites-moi savoir si cela fonctionne.
Il devrait simplement ajouter récursivement les positions supérieure et gauche de chaque conteneur parent. Vous pouvez également l'implémenter avec un Point
si vous le souhaitez.
L'API Android fournit déjà une méthode pour y parvenir. Essaye ça:
Voici le doc
la source
parentViewGroup
peut s'agir de n'importe quel parent dans la hiérarchie des vues, donc cela fonctionne parfaitement pour ScrollView également.Veuillez utiliser
view.getLocationOnScreen(int[] location);
(voir Javadocs ). La réponse est dans le tableau d'entiers (x =location[0]
et y =location[1]
).la source
J'obtiens d'abord la disposition racine, puis je calcule la différence de coordonnées avec la vue.
Vous pouvez également utiliser le à la
getLocationOnScreen()
place degetLocationInWindow()
.la source
Pas besoin de le calculer manuellement.
Utilisez simplement getGlobalVisibleRect comme ceci:
Notez également que pour les coordonnées du centre, plutôt que quelque chose comme:
Vous pouvez simplement faire:
la source
getGlobalVisibleRect
est faitglobalOffset.set(-mScrollX, -mScrollY);
pour que vous puissiez simplement obtenir ces valeurs avecgetScollX/Y
si vous n'avez besoin que des coodinates relatifs.Vous pouvez utiliser `
; `pour obtenir correctement l'emplacement de votre vue.
Mais il y a une prise si vous utilisez avant la mise en page vous a été gonflé obtiendrez une mauvaise position.
La solution à ce problème est d'ajouter
ViewTreeObserver
comme ceci: -Déclarez globalement le tableau pour stocker la position xy de votre vue
puis ajoutez
ViewTreeObserver
votre mise en page parent pour obtenir un rappel pour l'inflation de la mise en page, puis récupérez la position de la vue, sinon vous obtiendrez de mauvaises coordonnées xypuis utilisez-le comme ça
la source
Je me suis écrit deux méthodes utilitaires qui semblent fonctionner dans la plupart des conditions, la gestion du défilement, de la traduction et de la mise à l'échelle, mais pas de la rotation. Je l'ai fait après avoir essayé d'utiliser offsetDescendantRectToMyCoords () dans le cadre, qui avait une précision incohérente. Cela a fonctionné dans certains cas, mais a donné de mauvais résultats dans d'autres.
"point" est un tableau flottant avec deux éléments (les coordonnées x & y), "ancestor" est un groupe de vues quelque part au-dessus du "descendant" dans la hiérarchie de l'arborescence.
D'abord une méthode qui va des coordonnées descendantes à l'ancêtre:
Ensuite l'inverse, de l'ancêtre au descendant:
la source
Incase quelqu'un essaie toujours de comprendre cela. C'est ainsi que vous obtenez le centre X et Y du
view
.la source
Je viens de trouver la réponse ici
Il dit: Il est possible de récupérer l'emplacement d'une vue en appelant les méthodes getLeft () et getTop (). Le premier renvoie la coordonnée gauche, ou X, du rectangle représentant la vue. Ce dernier retourne la coordonnée supérieure, ou Y, du rectangle représentant la vue. Ces méthodes renvoient toutes deux l'emplacement de la vue par rapport à son parent. Par exemple, lorsque getLeft () renvoie 20, cela signifie que la vue est située à 20 pixels à droite du bord gauche de son parent direct.
alors utilisez:
la source