8 votes

Recherche de l'emplacement (position) de la vue sur l'affichage (écran) dans Android

Je veux trouver la position de la vue sur l'écran d'affichage.

Pour ce faire, j'utilise les méthodes telles que view.getLeft() , view.getBottom() , view.getRight() , view.getTop() . Mais malheureusement, toutes ces méthodes sont retournées 0 .
Existe-t-il un autre moyen de trouver les positions de la vue (c'est-à-dire les coordonnées à l'écran) ?

Ma mise en page main.xml :

<TextView android:id="@+id/tv1"
    android:layout_width="200px"
    android:layout_height="30px"
    android:text="welcome to" />

<TextView android:id="@+id/tv2"
    android:layout_width="200px"
    android:layout_height="30px"
    android:text=" Make Eit solution " />

Et ma classe a ceci en onCreate() :

super.onCreate(savedInstanceState);
setContentView(R.layout.main);

tv1 = (TextView) findViewById(R.id.tv1);
tv2 = (TextView) findViewById(R.id.tv2);

System.out.println("tv4 width:"+tv2.getWidth());
System.out.println("tv4 height:"+tv2.getHeight());
System.out.println("Right:"+tv2.getRight());
System.out.println("Left:"+tv2.getLeft());
System.out.println("Top:"+tv2.getTop());
System.out.println("Bottom:"+tv2.getBottom());

8voto

Nepster Points 893

Le moyen le plus simple est de l'obtenir en utilisant View.getLocationOnScreen(); OU getLocationInWindow();

Et si vous veut la position par rapport à Root Layou t alors Voir

6voto

sanjay Points 881

Utilisez le getLeft() , getRight() , getTop() y getBottom() . Ceux-ci peuvent être utilisés après l'instanciation de la vue.

6voto

Vishal_Pandey Points 51

Les méthodes que vous avez écrites sont suffisantes pour trouver l'emplacement sur l'écran, mais l'endroit où vous avez écrit n'est pas correct.

essayer d'écrire les méthodes (view.getLeft(), view.getTop()... etc) en onWindowFocusChanged(boolean hasFocus) méthode.

par exemple...

**

@Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus) {
                System.out.println("Right:"+tv2.getRight());
                System.out.println("Left:"+tv2.getLeft());
                System.out.println("Top:"+tv2.getTop());
        }
    }

**

cela résoudra votre problème.

3voto

VodkaTonic Points 228

Vous ne pouvez vraiment pas avoir la vue avant. Vous pouvez vouloir faire un explicite en utilisant invalidate() si possible ou vous pouvez le vérifier dans le onPostResume() ou onResume() fonction.

Si vous essayez simplement des choses et voulez vous amuser avec les threads, ce bloc de code placera votre code sur le thread de l'interface utilisateur et attendra que tout soit rendu pour ensuite afficher votre code :

final View gv = this;
ViewTreeObserver vto = gv.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @SuppressLint("NewApi")
    public void onGlobalLayout() {
        gv.getViewTreeObserver().removeGlobalOnLayoutListener(this);

        tv1=(TextView)findViewById(R.id.tv1);
        tv2=(TextView)findViewById(R.id.tv2);
        System.out.println("tv4 width:"+tv2.getWidth());
        System.out.println("tv4 height:"+tv2.getHeight());
        System.out.println("Right:"+tv2.getRight());
        System.out.println("Left:"+tv2.getLeft());
        System.out.println("Top:"+tv2.getTop());
        System.out.println("Bottom:"+tv2.getBottom());
}

Ce dernier point est assez lourd à porter, mais il fera l'affaire. J'ai l'habitude de mettre toutes les lignes comme celle-ci dans mes journaux (par ex. android.util.Log )

2voto

Leif Points 21

Je ne suis pas sûr que vous puissiez obtenir la position de la vue avant que la phase de mise en page ait été effectuée. Une fois que la vue est mise en page, vous pouvez utiliser getLocationOnScreen pour obtenir la position de la vue. getTop et similaire ne renvoie que la position de la vue dans son parent.

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