Incorrect Coordinates From getLocationOnScreen/getLocationInWindow

前端 未结 4 1233
时光取名叫无心
时光取名叫无心 2020-11-29 02:10

A call to getLocationOnScreen() or getLocationInWindow() both give me a top/Y coordinate that is about ~30px (status/notifications bar

相关标签:
4条回答
  • 2020-11-29 02:11

    This answer does not include how to get the status bar height, but it does explain the behavior of getLocationOnScreen() and getLocationInWindow() returning the same value.

    In the case of a normal activity (not a dialog) you should expect these two methods to return the same value. A Window lays out underneath (as in z-order not y coordinates) the status bar, so these methods cannot be used to determine the height of the status bar.

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

    0 讨论(0)
  • 2020-11-29 02:12

    Here is how I like to get the status bar height, and adjust the 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 讨论(0)
  • 2020-11-29 02:14

    I am having the same problem, try using

    offset = myView.GetOffsetY();
    

    and adjust your Y coord by that value, e.g.

    coordY -= offset;
    

    The class which offers the ``-method:

    class MyView extends View {
    
      public int GetOffsetY() {
        int mOffset[] = new int[2];
        getLocationOnScreen( mOffset );
        return mOffset[1]; 
      }
    
    }
    
    0 讨论(0)
  • 2020-11-29 02:27

    I ended up solving this issue by determining the height of the status/notification bar like so:

    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 讨论(0)
提交回复
热议问题