0%

第3章——View的事件体系

View 基础知识

1、 MotionEvent 和 TouchSlop

MotionEvent

这里只需要注意一点,通过MotionEvent 可以获得点击事件发生的x和y坐标,系统提供了两组方法,getX/getY 和 getRawX/getRawY ,他们的区别很简单,前者返回的是相对于当前View的左上角的 x 和 y 坐标,后者返回的是相对于手机屏幕左上角的 x和y 坐标。

TouchSlop

TouchSlop 是系统所能识别出的被认为是滑动的最小距离,小于这个值就不认为是滑动操作。TouchSlop 是一个常量,和设备有关,在不同的设备上这个值可能是不同的。通过如下方式可以获取这个常量:

ViewConfiguration.get(context).getScaledTouchSlop()

2、VelocityTracker、GestureDetector 和 Scroller

VelocityTracker

用于追踪手指在滑动过程中的速度,包括水平和竖直方向的速度。它的使用过程很简单,首先在 View 的 onTouchEvent 方法中追踪当前单击事件的速度:

VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);

接着,当我们想知道当前的滑动速度时,可以采用如下方法获得:

velocityTracker.computeCurrentVelocity(1000);
int xVelocity = (int)velocityTracker.getXVelocity();
int yVelocity = (int)velocityTracker.getYVelocity();

这里需要注意的是: 一、获取速度之前必须先计算速度;二、这里的速度是指一段时间内手指所划过的像素数,比如将时间间隔设置为 1000ms,在 1s 内水平从左至右滑过100像素,那么水平速度就是100 。如果将时间间隔设置为100ms,在这100ms 内滑过10像素,则水平速度会变成 10 。此外,这个速度是可以为负值的,当水平方向从右往左滑动时,水平方向的速度即为负值。

GestureDetector

手势检测,用于辅助检测用户的单击、滑动、长按、双击等行为。比如要监听双击行为,代码如下:

GestureDetector mGestureDetector = new GestureDetector(listener);
//再加上这行可以解决长按屏幕后无法拖动的现象
mGestureDetector.setIsLongpressEnabled(false);

接着,接管目标View的onTouchEvent方法,在待监听View的 onTouchEvent 方法中如下实现:

boolean consume = mGestureDetector.onTouchEvent(event);
return consume;

OnGestureListener 与 OnDoubleTapListener 里面的方法有很多,常用的有:onSingleTapUp(单击)、onScroll(拖动)、onLongPress(长按)、onFling(快速滑动)、onScroll(拖动)、onDoubleTap(双击)。

Scroller

弹性滑动对象,用于实现View的弹性滑动,我们知道,当使用View的scrollTo/scrollBy方法来进行滑动时,其过程是瞬间完成的,这时候就可以使用 Scroller 来实现有过渡效果的滑动,它需要和View的conputeScroll方法配合使用才能共同完成这个功能,典型的使用如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Scroller mScroller = newScroller(context);

//缓慢滑动到指定位置
privte void smoothScrollTo(int destX,int destY){
int scrollX = getScrollX();
int delta = destX - scrollX;
//1000ms内滑向destX就是,效果就是慢慢滑动
mScroller.startScroll(scrollX,0,delta,0,1000);
invalidate();
}

@Override
public void computeScroll(){
if(mScroller.computeScrollOffset()){
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
postInvalidate()
}
}

View 的滑动

未完待续。。。

谢谢你的鼓励