web-dev-qa-db-fra.com

Coordonnées incorrectes de getLocationOnScreen / getLocationInWindow

Un appel à getLocationOnScreen() ou getLocationInWindow() me donne à la fois un top/Y coordonnée d'environ ~ 30 pixels (hauteur de la barre d'état/notifications) trop bas. Le left/X la coordonnée est morte.

Comme je l'ai laissé entendre ci-dessus, je pense que la différence est due à la barre d'état/de notification ... Je peux me tromper. Je pense que je peux résoudre ce problème si je peux déterminer la taille de la barre de notification, mais j'ai du mal à le faire.

Toute aide serait grandement appréciée.

57
nimph

J'ai fini par résoudre ce problème en déterminant la hauteur de la barre d'état/de notification comme suit:

View globalView = ...; // the main view of my activity/application

DisplayMetrics dm = new DisplayMetrics();
this.getWindowManager().getDefaultDisplay().getMetrics(dm);
int topOffset = dm.heightPixels - globalView.getMeasuredHeight();

View tempView = ...; // the view you'd like to locate
int[] loc = new int[2]; 
tempView.getLocationOnScreen(loc);

final int y = loc[1] - topOffset;
81
nimph

Voici comment j'aime obtenir la hauteur de la barre d'état et régler le décalage:

final int[] location = new int[2];
anchor.getLocationInWindow(location); // Includes offset from status bar, *dumb*
Rect anchorRect = new Rect(location[0], location[1],
        location[0] + anchor.getWidth(), location[1] + anchor.getHeight());

anchor.getRootView().findViewById(Android.R.id.content).getLocationInWindow(location);
int windowTopOffset = location[1];
anchorRect.offset(0, -windowTopOffset);
7
satur9nine

J'ai le même problème, essayez d'utiliser

offset = myView.GetOffsetY();

et ajustez votre coordonnée Y par cette valeur, par ex.

coordY -= offset;

La classe qui propose la `` -méthode:

class MyView extends View {

  public int GetOffsetY() {
    int mOffset[] = new int[2];
    getLocationOnScreen( mOffset );
    return mOffset[1]; 
  }

}
5
user330844

Cette réponse n'inclut pas comment obtenir la hauteur de la barre d'état, mais elle explique le comportement de getLocationOnScreen() et getLocationInWindow() retournant la même valeur.

Dans le cas d'une activité normale (pas une boîte de dialogue), vous devez vous attendre à ce que ces deux méthodes retournent la même valeur. Une fenêtre présente sous (comme dans l'ordre z et non les coordonnées y) la barre d'état, donc ces méthodes ne peuvent pas être utilisées pour déterminer la hauteur de la barre d'état.

https://stackoverflow.com/a/20154562/777165

4
groucho