Неправильные координаты из getLocationOnScreen / getLocationInWindow

Вызов getLocationOnScreen() или getLocationInWindow() дает мне top/Y координату, которая составляет около getLocationInWindow() высота строки состояния / уведомлений) слишком далеко вниз. Координата left/X мертва.

Как я намекнул выше, я считаю, что разница в том, что это строка состояния / уведомления … Я могу ошибаться. Я думаю, что могу решить эту проблему, если я могу определить размер панели уведомлений, но у меня проблемы с этим.

Любая помощь будет принята с благодарностью.

Solutions Collecting From Web of "Неправильные координаты из getLocationOnScreen / getLocationInWindow"

Я решил решить эту проблему, указав высоту строки состояния / уведомления следующим образом:

 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; 

У меня такая же проблема, попробуйте использовать

 offset = myView.GetOffsetY(); 

И настройте координату Y на это значение, например

 coordY -= offset; 

Класс, который предлагает “ -метод:

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

Этот ответ не включает в себя, как получить высоту строки состояния, но он объясняет поведение getLocationOnScreen() и getLocationInWindow() возвращающее то же значение.

В случае нормальной активности (а не диалога) вы должны ожидать, что эти два метода возвратят одинаковое значение. Окно располагается под (как и в координатах z-order not y) в строке состояния, поэтому эти методы не могут использоваться для определения высоты строки состояния.

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

Вот как мне нравится получить высоту строки состояния и отрегулировать смещение:

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