View的事件体系 - View基础知识

版权声明:本文为博主原创文章,未经博主允许不得转载。 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/getYgetRawX/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测量完成后,才能获取到具体值。

参考

猜你喜欢

转载自blog.csdn.net/hzw2017/article/details/81293660