448 votes

Comment obtenir les coordonnées absolues d’une vue

Je vais essayer d'obtenir l'absolu pixel de l'écran, les coordonnées de l'angle supérieur gauche de la vue. Cependant, toutes les méthodes que je peux trouver comme getLeft() et getRight() ne fonctionnent pas comme ils semblent tous être par rapport au parent de la vue, ce qui me donne le 0. Quelle est la bonne façon de le faire?

Si cela peut aider, c'est pour une " mettre l'image en arrière dans l'ordre de jeu. Je veux que l'utilisateur soit capable de dessiner une zone de texte pour sélectionner plusieurs morceaux. Mon hypothèse est que la meilleure façon de faire c'est-à - getRawX() et getRawY() de la MotionEvent , puis de comparer ces valeurs contre le coin supérieur gauche de la disposition de la tenue de la pièces. La connaissance de la taille des pièces, je peux alors déterminer combien de pièces ont été sélectionnés. Je me rends compte que je peux utiliser getX() et getY() sur le MotionEvent, mais qui renvoie à une position relative qui fait de déterminer quelles pièces ont été sélectionnées plus difficile. (Pas impossible, je le sais, mais il semble inutilement compliqué).

Merci!

Edit: C'est le code que j'ai utilisé pour essayer d'obtenir la taille du contenant, selon l'une des questions. TableLayout est la table qui contient toutes les pièces du puzzle.

TableLayout tableLayout = (TableLayout) findViewById(R.id.tableLayout);
Log.d(LOG_TAG, "Values " + tableLayout.getTop() + tableLayout.getLeft());

Edit 2: Voici le code que j'ai essayé, à la suite de plusieurs des réponses suggérées.

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]);

Ce code a été ajouté après l'initialisation est terminée. L'image a été divisé en un tableau de ImageViews (les cellules de tableau []) contenues dans une TableLayout. Les cellules[0] est le premier à gauche ImageView, et j'ai pris des cellules[4], comme il est quelque part au milieu et plus certainement ne devrait pas avoir de coordonnées (0,0).

Le code ci-dessus me donne encore tous les 0s dans les journaux, je ne comprends vraiment pas parce que les différentes pièces du puzzle sont correctement affichées. (J'ai essayé public int pour tableLayoutCorners et de visibilité par défaut, les deux donnant le même résultat.)

Je ne sais pas si c'est significatif, mais l' ImageViews sont à l'origine n'a pas de taille. La taille de l' ImageViews est déterminé lors de l'initialisation automatiquement par la Vue lorsque je lui donne une image à afficher. Cela pourrait-il contribuer à leurs valeurs de 0, même si ce code d'enregistrement est après qu'ils ont été donné une image et ont automatiquement redimensionnée eux-mêmes? Pour éventuellement contrer cela, j'ai ajouté le code tableLayout.requestLayout() comme indiqué ci-dessus, mais cela n'a pas aidé.

Je suis perplexe... Merci encore à tous ceux qui peuvent aider.

692voto

Romain Guy Points 57114

Utilisation ou .

108voto

Naveen Murthy Points 1965

Tout d’abord vous devez obtenir le rectangle de localVisible de la vue

Pour par exemple :

Espérons que cela aidera

49voto

Simon Points 8591

À l’aide d’un écouteur de la mise en page globale a toujours bien fonctionné pour moi. Il a l’avantage de pouvoir mesurer choses si la disposition est modifiée, par exemple si quelque chose est défini à View.GONE ou vues enfants sont ajoutés/supprimés.

18voto

Steve Haley Points 26928

Suivant Romain Guy commentaire, voici comment je l'ai corrigé. J'espère que ça va aider quelqu'un d'autre qui avait aussi ce problème.

J'ai en effet essayer d'obtenir les positions des points de vue avant qu'ils aient été disposés sur l'écran, mais il n'était pas du tout évident qui se passait. Ces lignes a été placé après l'initilisation code couru, alors j'ai supposé que tout était prêt. Toutefois, ce code était encore dans onCreate(); expérimentation de Fil.sleep (), j'ai découvert que la mise en page n'est pas réellement finalisé qu'après onCreate() tout le chemin à onResume() a fini de s'exécuter. Donc en effet, le code a été d'essayer de l'exécuter avant la mise en page a eu fini d'être positionné sur l'écran. En ajoutant le code pour un OnClickListener (ou Auditeur) les valeurs correctes ont été obtenus parce qu'il ne pouvait être congédié après la mise en page a eu fini.


La ligne ci-dessous a été proposé comme une communauté edit:

veuillez utiliser onWindowfocuschanged(boolean hasFocus)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X