2.3.2 识别手势滑动的方向

除了点击和长按,分辨手势的滑动方向也很重要,手势往左抑或往右代表着左右翻页,往上或者往下代表着上下滚动。另外,手势向下还可能表示下拉刷新,手势向上还可能表示上拉加载,总之,上、下、左、右四个方向各有不同的用途。

直观地看,手势在水平方向掠过,意味着左右滑动;手势在垂直方向掠过,意味着上下滚动。左右滑动的话,手势触摸的起点和终点在水平方向的位移必定大于垂直方向的位移;反之,上下滚动的话,它们在垂直方向的位移必定大于水平方向的位移。据此可将滑动方向的判定过程分解成以下三个步骤:

对于按下手指事件,把当前点标记为起点,并记录起点的横纵坐标。

对于松开手指事件,把当前点标记为终点,并记录终点的横纵坐标。

分别计算起点与终点的横坐标距离以及它们的纵坐标距离,根据横纵坐标的大小关系判断本次手势的滑动方向。

于是重写自定义触摸视图的onTouchEvent方法,分别处理按下、移动、松开三种手势事件;同时重写该视图的onDraw方法,描绘起点与终点的位置,以及从起点到终点的路径线条。按照上述思路,编写单指触摸视图的代码:

(完整代码见event\src\main\java\com\example\event\widget\SingleTouchView.java)

然后在布局文件中添加SingleTouchView节点,并在对应的活动页面调用setFlipListener方法设置手势滑动监听器,看看手势到底往哪个方向滑动。下面是设置手势监听器的示例代码:

(完整代码见event\src\main\java\com\example\event\SlideDirectionActivity.java)

运行并测试该App,手势滑动效果如图2-18~图2-21所示。图2-18为左滑手势的检测结果,图2-19为右滑手势的检测结果,图2-20为上滑手势的检测结果,图2-21为下滑手势的检测结果。

图2-18 左滑手势的检测结果

图2-19 右滑手势的检测结果

图2-20 上滑手势的检测结果

图2-21 下滑手势的检测结果