View事件的体系
- 1、view的位置参数
- 2、view的触控
- 3、view的滑动
- 4、view的事件分发机制
- 5、view滑动冲突
View的工作原理
- 6、view工作流程
- 7、自定义view
关于View
在Android中View是所有控件(Button、RelationLayout等)的基类,其中也包括ViewGroup在内,ViewGroup是代表控件的集合。
一、view的位置参数
a、Android坐标系:以屏幕的左上角为坐标原点,向右为x轴增大方向,向下为y轴增大方向。
b、View的位置由它的四个顶点决定,分别对应View的四个属性:top、left、right、bottom。其中left是左上角的横坐标,right是右下角的横坐标,top是左上角的纵坐标,bottom是右下角的纵坐标。注意这些坐标是相对于view父容器而言,是一种相对的坐标。具体关系见下图:
因此,View的宽高和坐标关系:width = right - left,height = bottom - top。
可利用View中的get方法获取上述属性,如下:
- Left = getLeft();
- Right = getRight();
- Top = getTop();
- Bottom = getBottom();
- width = getWidth();
- height = getHeight();
从Android3.0开始,View增加了额外的参数:x,y,trancelationX、translationY。其中x和y是View左上角的坐标,trancelationX 和trancelationY是View左上角相对于父容器的偏移量,他们默认值是0.这些参数也是相对于View容器。具体如下:
1、参在的关系:x = left + trancelationX,y = top + translationY
2、由此可见,x和left不同体现在:left是View的初始坐标,在绘制完毕后就不会再改变;而x是View偏移后的实时坐标,是实际坐标。y和top的区别同理。
类似地,安卓也提供了相应的get/set方法。需要注意的是,在onCreate()方法里无法获取到View的坐标参数,这是因为此时View还未开始绘制,全部坐标参数将都是0。
GestureDetector的介绍
内部有三个Listener接口,用于回调不同类型的触摸事件。
1、OnGestureListener
2、OnDoubleTapListener
3、OnContextClickListener
4、SimpleOnGestureListener
二、触控系列
1、MotionEvent:在手机接触屏幕后所产生的一系列事件
ACTION_DOWN:手指刚接触到屏幕;
ACTION_MOVE:手指在屏幕上移动
ACTION_UP:手指从屏幕上松开的瞬间
事件列:从手指接触屏幕至手指离开屏幕,这个过程产生的一系列事件
任何事件列都是以DOWN事件开始,UP事件结束,中间有无数的MOVE事件。如图:
通过MotionEvent对象可以得到触摸事件的x、y坐标。其中通过getX()、getY()可获取相对于当前的View 左上角的x 和 y坐标;通过getRawX和getRawY,他们的区别很简单,getRawX和getRawY是手机屏幕的左上角的x 、y坐标
2、TouchSlop
TouchSlop:系统所能识别的最小的滑动距离。即当手指在屏幕上滑动时,如果两次的距离都小于这个常量,那么系统不认为你在滑动操作。
此常量与设备有关(在不同的手机上的值是不同的),获取办法:
ViewConfiguration.get(getContext()).getScaledTouchSlop();
3、VelocityTracker:
速度追踪,用于追踪手指在滑块滑动过程中的速度,包括水平、竖直方向的速度。
使用过程:首先在View的onTouchEvent方法中追追踪当前单击事件的速度:
VelocityTracker velocityTrack = VelocityuTracker.obtain(); //实例化VelocityTrack
velocityTracker.addMovement(event); //提娜佳追踪事件
接着在ACTION_UP事件中获取当前的速度。注意这里计算的是1000ms时间间隔移动的像素值,假设像素是100,即速度是每秒100像素。另外,手指逆着坐标系的正方向滑动,所产生的速度为负值,顺着正反向滑动,所产生的速度为正值。
velocityTracker.computeCurrentVelocity(1000); //获取速度前计算速度,这里计算的是在1000毫秒内的
int xVelocity = velocityTrack.getXVelocity(); //获取水平方向的速度(从左向右)
int yVelocity = velocityTrack.getYVelocity(); //获取竖直方向上的速度
最后,当不需要使用它的时候,需要调用clear()方法来重置并回收内存:
velocityTrack.