##1、背景
在自定义View开发中我们经常需要求一个View的宽、高;以及我们触摸事件(MotionEvent)的X,Y坐标;经常搞不明白他们的值,今天刚好星期天就网上查了资料,总结一下;
2、理解
我们之前学物理时,接触到相对的概念。一个物体的动与静是根据参考不同结果也是不一样的。同样在Android中,我们在求一个坐标时,根据我们的不同的API,它的参考点也是不一样的。我么只有明白了在什么情况下参考点在哪里,就可以非常轻松的求得坐标系。
##3、解答
在Android中有两种参考点(坐标系):原点坐标系、视图坐标系、自己坐标(个人创造)
原点坐标系:以手机屏幕的左上角为参考点(坐标原点),以该点向右为X轴的正方向;以改点向下为Y轴的正方向。
参考图如下:(网络图)
视图坐标系:它是以父视图为参考点
参考图如下:(网络图)
自己坐标:以自己(View)的左上角为原点。
###下面我们需要知道的是在什么情况下使用原点坐标系、什么时候使用视图坐标系?
####原点坐标:
MotionEvent提供的方法:
getRawX() 获取到的是点击事件距离整个屏幕左边的距离
getRawY() 获取到的是点击事件距离整个屏幕顶边的距离
####视图坐标:
View提供的获取的坐标以及距离的方法:
getTop() 获取到的是view自身的顶边到其父布局顶边的距离
getLeft() 获取到的是view自身的左边到其父布局左边的距离
getRight() 获取到的是view自身的右边到其父布局左边的距离
getBottom() 获取到的是view自身底边到其父布局顶边的距离
####自己坐标:
MotionEvent提供的方法:
getX() 获取点击事件距离控件左边(自己左边界)的距离,即视图坐标
getY() 获取点击事件距离控件顶边(自己上边界)的距离,即视图坐标
##4、补充
Android手机中各个区域的理解(网络图):
通过上图我们可以很直观的看到Android对于屏幕的划分定义。下面我们就给出这些区域里常用区域的一些坐标或者度量方式。如下:
//获取屏幕区域的宽高等尺寸获取
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int widthPixels = metrics.widthPixels;
int heightPixels = metrics.heightPixels;
//应用程序App区域宽高等尺寸获取
Rect rect = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
//获取状态栏高度
Rect rect= new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
int statusBarHeight = rectangle.top;
//View布局区域宽高等尺寸获取
Rect rect = new Rect();
getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(rect);
**特别注意:上面这些方法最好在Activity的onWindowFocusChanged ()**方法或者之后调用;
关于静态坐标和动态坐标的理解:请看深入浅析Android坐标系统