获得当前view在屏幕的坐标

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.

top是左上角纵坐标,left是左上角横坐标,right是右下角横坐标,bottom是右下角纵坐标。而x,y是左上角横纵坐标,是android 3.0之后加入的, 也是相对于父容器的坐标。

注意:View.getX() ; 要区分于MotionEvent.getRawX(); 和MotionEvent.getX(); 在public boolean onTouch(View view, MotionEvent event) 中,当你触到控件时,x,y是相对于该控件左上点(控件本身)的相对位置。 而rawx,rawy始终是相对于屏幕的位置。getX()是表示Widget相对于自身左上角的x坐标,而getRawX()是表示相对于屏幕左上角的x坐标值 (注意:这个屏幕左上角是手机屏幕左上角,不管activity是否有titleBar或是否全屏幕)。

View.getLocationInWindow()和 View.getLocationOnScreen()的区别

View.getLocationInWindow()和 View.getLocationOnScreen()在window占据全部screen时,返回值相同,不同的典型情况是在Dialog中时。 当Dialog出现在屏幕中间时,View.getLocationOnScreen()取得的值要比View.getLocationInWindow()取得的值要大。

getTop()和getY()的区别

一般情况下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