web-dev-qa-db-ja.com

getLocationOnScreen / getLocationInWindowからの誤った座標

getLocationOnScreen()またはgetLocationInWindow()を呼び出すと、両方ともtop/Y座標が約30ピクセル(ステータス/通知バーの高さ)を下回っています。 left/X座標は無効です。

上でほのめかしたように、違いはステータス/通知バーによるものだと思います...私は間違っているかもしれません。通知バーのサイズを決定できればこれを解決できると思いますが、それだけではうまくいきません。

どんな助けも大歓迎です。

57
nimph

ステータス/通知バーの高さを次のように決定することで、この問題を解決しました。

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

ステータスバーの高さを取得し、オフセットを調整する方法を次に示します。

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

私は同じ問題を抱えています、使用してみてください

offset = myView.GetOffsetY();

その値でY座標を調整します。

coordY -= offset;

`` -method:を提供するクラス:

class MyView extends View {

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

}
5
user330844

この回答には、ステータスバーの高さを取得する方法は含まれていませんが、getLocationOnScreen()getLocationInWindow()が同じ値を返す動作を説明しています。

通常のアクティビティ(ダイアログではない)の場合、これら2つのメソッドが同じ値を返すことを期待する必要があります。 Windowはステータスバーの下に(y座標ではなくzオーダーのように)レイアウトされるため、これらのメソッドを使用してステータスバーの高さを決定することはできません。

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

4
groucho