版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hzw2017/article/details/81293660
View
View是Android所有控件的基类,任何一个控件都是View的子类。
坐标系
关于Android的坐标系可以从以下几点加深理解:
- 手机屏幕坐标系与数学坐标系的区别
- View坐标系
- MotionEvent的get与getRaw获取坐标的区别
手机屏幕与数学坐标系的区别
手机屏幕坐标是从左上角为原点,向右为X轴的递增方向,向下为Y轴的递增方向,这与我们数学上的坐标系有着明显的区别,如下:
其中的∠a 是对应的,注意Y轴方向!
View的坐标系
- View的位置,只需知道
左上顶点
和右下顶点
的坐标就可决定具体位置。- View的顶点坐标是相对于父控件而言的。
左上顶点(x,y)
getLeft //子View左上角相对于父View的左侧距离
geTop //子View左上角相对于父View的顶部距离
右下顶点(x,y)
getRight //子View右下角相对于父View的左侧距离
getBottom //子View右下角相对于父View的顶部距离
可以根据左上顶点和右下顶点的坐标确定一个View的宽高,如下:
width = getRight - getLeft //宽
height = getBottom - getTop //高
MotionEvent的get与getRaw的区别
手指在接触屏幕后产生一系列事件,如下:
- ACTION_DOWN:手指刚接触屏幕
- ACTION_MOVE:手指在屏幕上移动
- ACTION_UP:手指离开屏幕的瞬间
正常情况下,触摸屏幕有以下一系列行为事件:
- 单击后立即松开:0 >> 1,即DOWN >> UP
- 单击后在屏幕上滑动一会儿再松开:0 >> 2 ···2 >> 1,即DOWN >> MOVE ··· MOVE >>UP
除了事件响应外,系统还提供了获取单击点击事件的坐标方法,分别是getX/getY
、getRawX/getRawY
;这两组方法是区别的,如下:
getX/getY
:是相对于当前View左上角的坐标
getRawX/getRawY
:是相对于手机屏幕左上角的坐标
另外获取视图上某个点的屏幕坐标除了getRaw方法外,还可以通过View自身的getLocationOnScreen(int[] outLocation)
方法来获取。
int[] views = new int[2];
mTvTest.getLocationOnScreen(views);
Log.d(TAG,name+ " -- x: " + views[0] + " y:" + views[1]);
在使用getLocationOnScreen
方法时,只能获取到View的左上顶点
的坐标,同时还需注意的是,如果直接在onCreate、onStart、onResume方法中调用是无法得到坐标的实际值,只有当屏幕焦点发生了改变时才可以获取实际坐标值
,比如在onWindowFocusChanged
或者在点击事件、滑动事件监听函数
中调用等等。
不单单getLocationOnScreen方法,其他获取坐标的方法及宽高,同样也需放在焦点发生变化时,才可以正确的获取到具体值,也就是说要待View测量完成后,才能获取到具体值。