Skip to content

Commit dc51d03

Browse files
committed
添加新文章
1 parent d7a98aa commit dc51d03

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# Android 手势检测(GestureDetector)
2+
3+
因为工作等原因,已经很长时间没有写文章了,趁节假日来水一篇简单的文章,Android 手势检测,如题,本文依旧是和事件相关的,如果你没看过之前的文章,可以到 [自定义 View 系列](http://www.gcssloop.com/customview/CustomViewIndex) 来查看前面的内容。
4+
5+
在开发 Android 手机应用过程中,可能需要对一些手势作出响应,如:单击、双击、长按、滑动、缩放等。这些都是很常用的手势。就拿最简单的双击来说吧,假如我们需要判断一个控件是否被双击(即在较短的时间内快速的点击两次),似乎是一个很容易的任务,但仔细考虑起来,要处理的细节问题也有不少,例如:
6+
7+
1. **记录点击次数**,为了判断是否被点击超过 1 次,所以必须记录点击次数。
8+
2. **记录点击时间**,由于双击事件是较快速的点击两次,像点击一次后,过来几分钟再点击一次肯定不能算是双击事件,所以在记录点击次数的同时也要记录上一次的点击时间,我们可以设置本次点击距离上一次时间超过一定时间(例如:超过1s)就不识别为双击事件。
9+
3. **点击状态重置**,在响应双击事件,或者判断不是双击事件的时候要重置计数器和上一次点击时间。重置既可以在点击的时候判断并进行重新设置,也可以使用定时器等超过一定时间后重置状态。
10+
11+
这样看起来,判断一个双击事件就有这么多麻烦事情,更别其他的手势了,虽然这些看起来都很简单,但设计起来需要考虑的细节情况实在是太多了。
12+
13+
那么有没有一种更好的方法来方便的检测手势呢?当然有啦,因为这些手势很常用,系统早就封装了一些方法给我们用,它就是 **GestureDetector** 。我们先看一下关于它的简单介绍:
14+
15+
> GestureDetector 可以使用 MotionEvents 检测各种手势和事件。GestureDetector.OnGestureListener 是一个回调方法,在发生特定的事件时会调用 Listener 中对应的方法回调。这个类只能用于检测触摸事件的 MotionEvent,不能用于轨迹球事件。
16+
> (话说轨迹球已经消失多长时间了,估计很多人都没见过轨迹球这种东西)。
17+
>
18+
> 如何使用:
19+
>
20+
> - 创建一个 GestureDetector 实例。
21+
> - 在onTouchEvent(MotionEvent)方法中,确保调用 GestureDetector 实例的 onTouchEvent(MotionEvent)。回调中定义的方法将在事件发生时执行。
22+
> - 如果侦听 onContextClick(MotionEvent),则必须在 View 的 onGenericMotionEvent(MotionEvent)中调用 GestureDetector OnGenericMotionEvent(MotionEvent)。
23+
24+
GestureDetector 本身的方法很少,使用起来也非常简单,下面让我们看一下它的简单使用方法。
25+
26+
```java
27+
// 创建一个监听回调
28+
SimpleOnGestureListener listener = new SimpleOnGestureListener() {
29+
@Override public boolean onDoubleTap(MotionEvent e) {
30+
Toast.makeText(MainActivity.this, "双击666", Toast.LENGTH_SHORT).show();
31+
return super.onDoubleTap(e);
32+
}
33+
};
34+
35+
// 创建一个检测器
36+
final GestureDetector detector = new GestureDetector(this, listener);
37+
38+
// 给监听器设置数据源
39+
view.setOnTouchListener(new View.OnTouchListener() {
40+
@Override public boolean onTouch(View v, MotionEvent event) {
41+
return detector.onTouchEvent(event);
42+
}
43+
});
44+
```
45+
46+
上面是监听一个双击事件,可以看到它使用起来非常简单,接下来我们就看一下有关于它的详细信息。
47+

0 commit comments

Comments
 (0)