Android坐标系
Android自定义View开发,首先必须要对Android中的坐标体系非常熟悉。它不同于我们以前数学中所学的笛卡尔坐标系:

1、绝对坐标系
Android中定义整个物理屏幕左上角为原点 O,包括状态栏在内。X轴水平向右,Y轴竖直向下。

2、视图坐标系
Android中的另一个坐标系叫做视图坐标系,不是参照绝对坐标系,而是View参照父控件。View中有多个获取坐标及控件大小相关的方法(单位:像素),开发者需要深入的理解一下它们的意义:
getX(); //子view左边到父视图左边的距离;
getY(); //子view上边到父视图上边的距离;
getTop(); //获取子View左上角距父View顶部的距离
getBottom(); //获取子View右下角距父View顶部的距离
getRight(); //获取子View右下角距父View左侧的距离
getLeft(); //获取子View左上角距父View左侧的距离
getWidth(); //子视图的长度;
getHeight(); //子视图的高度。2.1、getX 和 getY
getX()和getY()方法的定义如下:
/**
*返回该视图的可视x坐标,以像素为单位。.
*/
public float getX() {
return mLeft + getTranslationX();
}
/*
* 返回该视图的可视y坐标,以像素为单位。.
*/
public float getY() {
return mTop + getTranslationY();
}
2.2、getTop 和 Bottom
getTop()和getBottom()方法的定义如下:
/**
* 这个视图相对于其父视图的顶部位置。
*
* @return The top of this view, in pixels.
*/
public final int getTop() {
return mTop;
}
/**
* 这个视图相对于其父视图的底部位置。
*
* @return The bottom of this view, in pixels.
*/
public final int getBottom() {
return mBottom;
}
2.3、getLeft 和 getRight
getLeft()和getRight()方法的定义如下:
/**
* 这个视图相对于其父视图的左边位置。
*/
@ViewDebug.CapturedViewProperty
public final int getLeft() {
return mLeft;
}
/**
*这个视图相对于其父视图的右边位置。
*/
@ViewDebug.CapturedViewProperty
public final int getRight() {
return mRight;
}
2.4、getWidth 和 getHeight
getWidth()和getHeight()方法的定义如下:
/**
* 返回视图的宽度。
*/
public final int getWidth() {
return mRight - mLeft;
}
/**
* 返回视图的高度。
*/
public final int getHeight() {
return mBottom - mTop;
}2.5、关系小结
经过上面详细的梳理View中的坐标系及相关方法,可以总结出以下几点,对开发会有一些帮助:
getWidth() = getRigth() - getLeft()
getHeight() = getBottom() - getTop()
getX() == getLeft() + getTranslationX()
getY() == getTop() + getTranslationY()
3、触摸坐标系
Android View开发过程中,另一个重要的体系就是事件传递。要对触摸事件的传递有深入的理解,此外这其中也涉及到一些坐标,从屏幕的触摸事件MotionEvent中我们可以获取几个有用的坐标:
getX(); //落点到所触摸的view的左边的距离
getY(); //落点到所触摸的view的上边的距离
getRawX(); //落点到屏幕左边的距离
getRawY(); //落点到屏幕上边的距离
getRawX(int pointerIndex); //事件的原始X坐标。
getRawY(int pointerIndex); //事件的原始Y坐标。
参考博客:

