final int[] location = new int[2]; view.getLocationOnScreen(location); int x = location[0] ; int y = location[1] ;
这样就可以得到该视图在全局坐标系中的x,y值(注意这个值是要从屏幕顶端算起,也就是说包括了通知栏的高度).
View.getLeft() ; View.getTop() ; View.getBottom(); View.getRight() ; View.getX() ; View.getY() ;
这些都是相对坐标,例如如果在一个Button外面加一个RelativeLayout,让RelativeLayout宽高是wrap_content, 这样RelativeLayout的大小和Button一样,不管这个RelativeLayout放在窗口的哪里Button.getY()的值都是0.
View.getLocationInWindow()和 View.getLocationOnScreen()在window占据全部screen时,返回值相同,不同的典型情况是在Dialog中时。 当Dialog出现在屏幕中间时,View.getLocationOnScreen()取得的值要比View.getLocationInWindow()取得的值要大。
一般情况下getTop()和getY()返回值是一样的。查看源码: public final int getTop() { return mTop; } public float getY() { return mTop + getTranslationY(); } /** * The vertical location of this view relative to its {@link #getTop() top} position. * This position is post-layout, in addition to wherever the object's * layout placed it. * * @return The vertical position of this view relative to its top position, * in pixels. */ @ViewDebug.ExportedProperty(category = "drawing") public float getTranslationY() { return mRenderNode.getTranslationY(); }
getY的值是getTop+getTranslationY,这个getTranslationY是自己相对自己顶部的偏移。 可以通过setTranslationY(int mTranslationY) ;设置偏移,默认为0.
首先要知道Rect表示一个矩形,可以得到左上和右下角坐标:
Rect rect = new Rect(); //getWindow().getDecorView()得到的View是Window中的最顶层View,可以从Window中获取到该View, //然后该View有个getWindowVisibleDisplayFrame()方法可以获取到程序显示的区域, //包括标题栏,但不包括状态栏。 getWindow().getDecorView().getWindowVisibleDisplayFrame(rect); //1.获取状态栏高度: //根据上面所述,我们可以通过rect对象得到手机状态栏的高度 int statusBarHeight = rect.top; //2.获取标题栏高度: getWindow().findViewById(Window.ID_ANDROID_CONTENT); //该方法获取到的View是程序不包括标题栏的部分,这样我们就可以计算出标题栏的高度了。 int contentTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop(); //statusBarHeight是上面所求的状态栏的高度 int titleBarHeight = contentTop - statusBarHeight