首先,什么是View?在Android中,几乎所有的控件都继承自View,他是绝大部分控件的基类。包括常用的Button、TextView等以及RelativeLayout、LinearLayout等都是View,当然后者应当更加属于ViewGroup。ViewGroup内部是可以存在子View的,当然这个子View也还是可以是ViewGroup。
一、View位置相关
View的位置由他四个顶点坐标决定,分别是top、left、right、bottom,其中需要注意的是top和bottom分别是左上角和右下角的纵坐标,而left和right分别是左上角和右下角的横坐标。
他们直接的关系为:width=right - left,height = bottom - top。从3.0开始,View增加了几个额外的参数,分别是x、y、translationX和translationY,其中x、y分别是View的左上角坐标,translationX和translationY分别是View左上角相对于父容器的偏移量。
二、MotionEvent和TouchSlop
MotionEvent中比较重要的是:ACTION_DOWN(手指接触屏幕)、ACTION_MOVE(手指在屏幕上移动)、ACTION_UP(手指从屏幕上松开的一瞬间)。
可以通过MotionEvent可以得到点击事件的x和y坐标,getX/getY返回相对于View左上角的x和y坐标,getRawX/getRawY得到相对于屏幕左上角的x和y坐标。
TouchSlop是系统中最小滑动量,不同设备下可能不同。我们可以通ViewConfiguration.get(getContext()).getScaledTouchSlop()来获取这个值。当滑动距离小于这个值时,系统可以认为并没有发生滑动事件,我们也可以通过这个值来过滤一部分用户可能发生的误操作。
三、手势和滑动
Velocity,追踪速度。用于追踪手指在滑动过程中的速度,包括水平和竖直方向的速度。
VelocityTracker tracker = VelocityTracker.obtain();
tracker.addMovement(event);
//当我们想知道当前的滑动速度时,我们直接使用以下方法
tracker.computeCurrentVelocity(1000);
int xV = (int)tracker.getXVelocity();
int yV = (int)tracker.getYVelocity();
需要注意的是,当你的手指从右往左滑动的时候,水平方向为负值,从下往上滑动也是同理。最后在不用的时候我们依旧还是需要调用clear方法来重置并回收内存。
tracker.clear();
tracker.recycle();
GestureDetector,手势检查。用于辅助检测用户的点击、滑动、长按、双击等基础行为。使用过程参考如下
//先创建一个GestureDetector对象,并且实现OnGestureListener接口,
//也可以根据需要实现OnDoubleTapListener从而能监听双击行为
GestureDetector mDetector = new GestureDetector(this);
//解决长屏幕后无法拖动现象
mDetector.setInsLongpressEnabled(false);
//接着接管目标View的onTouchEvent方法,在待监听View的onTouchEvent方法中添加如下实现:
boolean consume = mDetector.onTouchEvent(event);
return consume;
未完待续...