Incorrect Coordinates From getLocationOnScreen/getLocationInWindow

AndroidAndroid Widget

Android Problem Overview


A call to getLocationOnScreen() or getLocationInWindow() both give me a top/Y coordinate that is about ~30px (status/notifications bar's height) too far down. The left/X coordinate is dead on.

As I hinted above, I believe the difference is because of the status/notification bar... I could be wrong. I think I can solve this if I can determine the size of the notification bar but, I'm having trouble doing just that.

Any help would be greatly appreciated.

Android Solutions


Solution 1 - Android

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;

Solution 2 - Android

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

Solution 3 - Android

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]; 
  }

}

Solution 4 - Android

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

Solution 5 - Android

As @ThammeGowda said that the correct answer will give incorrect position when the keyboard is shown but you still need to calculate the top offset of the action bar, so just get the action bar size directly

fun View.getPosition(): Point {
    val tv = TypedValue()
    if (context.theme.resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
        val actionBarHeight =
            TypedValue.complexToDimensionPixelSize(tv.data, resources.displayMetrics)

        val loc = IntArray(2).apply { getLocationInWindow(this) }

        val newY = loc[1] - actionBarHeight - (measuredHeight / 2) // to get the position in the middle of the view

        return Point(loc[0], newY)
    }
    return Point(0,0)
}

enter image description here

Solution 6 - Android

 void setOffset(){
  int[] point1=new int[2];
  view1.getLocationInWindow(point1);
  
  int[] point2=new int[2];
  view2.getLocationInWindow(point2);

  int leftOffset=point2[0]-point1[0];
  int topOffset=point2[1]-point1[1];  
  // no need to call this function more than once
  // set the offset values in global variables 
  // remenber do't call it in OnCreate method
  // this helps to mesure all type of screen size
}

void setLocationOfView(){
  // now do your animation or any view to move
 int[] point =new int[2];
 sourceView.getLocationInWindow(point);
 view.setX(point[0]-leftOffset);
 view.setY(point[1]-topOffset);
 //wow you did it i am glad to help you and sorry for being late
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionnimphView Question on Stackoverflow
Solution 1 - AndroidnimphView Answer on Stackoverflow
Solution 2 - Androidsatur9nineView Answer on Stackoverflow
Solution 3 - Androiduser330844View Answer on Stackoverflow
Solution 4 - AndroidgrouchoView Answer on Stackoverflow
Solution 5 - AndroidHussien FahmyView Answer on Stackoverflow
Solution 6 - AndroidSmruti ranjan SahooView Answer on Stackoverflow