2010-04-14 4 views
52

Ein Anruf an getLocationOnScreen() oder getLocationInWindow() beide geben mir eine top/Y Koordinate, die etwa ~ 30px (Status/Benachrichtigungen Balkenhöhe) zu weit unten ist. Die left/X Koordinate ist tot.Falsche Koordinaten von getLocationOnScreen/getLocationInWindow

Wie ich oben angedeutet habe, glaube ich der Unterschied ist wegen der Status/Benachrichtigungsleiste ... ich könnte falsch liegen. Ich denke, ich kann das lösen, wenn ich die Größe der Benachrichtigungsleiste bestimmen kann, aber ich habe Probleme damit.

Jede Hilfe würde sehr geschätzt werden.

Antwort

76

ich durch die Bestimmung der Höhe der Status/Benachrichtigungsleiste wie so dieses Problem zu lösen, endete:

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; 
+0

Dies funktionierte in der normalen Konfiguration, aber wenn die Aktivität die 'globalView'-Höhe einstellt, wenn SoftInput/Keyboard geöffnet ist, dann wird auch die Tastaturhöhe zu' topOffset 'gezählt, was zu einem falschen Wert für' y 'führt. –

+7

'int [] locInWindow = neuer int [2]; globalView.getLocationInWindow (locInWindow); topOffset = locInWindow [1]; '// Berechne' topOffset' durch Abrufen der Y-Koordinate von 'globalView' –

+1

Sparte mir viel Zeit, danke! – Justin

5

ich das gleiche Problem habe, versuchen

offset = myView.GetOffsetY(); 

und geben Sie Ihre Y-Koordinaten zum Runterladen von diesem Wert einzustellen, z.B.

coordY -= offset; 

Die Klasse, die den `` -Methode bietet:

class MyView extends View { 

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

} 
+0

Ich sehe nicht, "getOffsetY()". Um welche Klasse handelt es sich? – nimph

+0

Es tut mir leid, konnte ich die Methode schreiben, in Klasse MyView erstreckt Ansicht { \t public int GetOffsetY() \t { int Moffset [] = new int [2]; \t \t getLocationOnScreen (mOffset); \t \t Rückgabe mOffset [1]; } – user330844

5

Hier ist, wie ich gerne die Statusleiste Höhe, und stellen Sie den Offset:

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); 
+0

Warum ist es dumm, dass die Position im Fenster Offset von der Statusleiste enthält? Sie fragen nach dem Ort * im Fenster *, was erwarten Sie sonst noch? –

+1

Man würde annehmen, dass das Fenster unterhalb der Statusleiste liegt, daher würde der Offset die Höhe der Statusleiste nicht enthalten. – satur9nine

+0

Sie verwirren Fenster mit Bildschirm, denke ich. –

4

Diese Antwort enthält nicht, wie die Höhe der Statusleiste abgerufen wird, aber es erklärt das Verhalten von getLocationOnScreen() und getLocationInWindow(), die den gleichen Wert zurückgeben.

Im Falle einer normalen Aktivität (kein Dialog) sollten Sie erwarten, dass diese beiden Methoden den gleichen Wert zurückgeben. Ein Fenster legt die Statusleiste darunter (in Z-Reihenfolge, nicht in Y-Koordinaten) an, sodass diese Methoden nicht zum Ermitteln der Höhe der Statusleiste verwendet werden können.

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

+0

in Dialog Ansicht, es funktioniert gut, wenn nicht aus dem Fenster Vollbild ist true gesetzt, aber wenn wie folgt festgelegt: true dann wird der Wert nicht korrekt ist, so subtrahieren müssen der 'topOffset' – iXcoder