在Android的View中,手势检测用于辅助检测用户单击、滑动、长按、双击等行为。我们这篇文章主要介绍如何使用它:
一、GestureDetector.OnGestureListener
1、我们可以通过这个接口监听一些手势
代码如下:
public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener {
private static final String TAG = "MainActivity";
private GestureDetector gestureDetector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gestureDetector = new GestureDetector(this);
}
public MainActivity() {
super();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
@Override
public boolean onDown(MotionEvent e) {
Log.i(TAG, "onDown: 点击了");
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
Log.i(TAG, "onSingleTapUp: 点击了");
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
Log.i(TAG, "onScroll: 点击了");
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Log.i(TAG, "onFling: 点击了");
return false;
}
}
如果我们是单点之后可以看到日志:
![](https://i-blog.csdnimg.cn/blog_migrate/fad03e47c65db3f342d4f407881dba3c.png)
滑动的日志:
![](https://i-blog.csdnimg.cn/blog_migrate/720fb084136699a18b42fbeffd55a07c.png)
长点击:
![](https://i-blog.csdnimg.cn/blog_migrate/9806f71e2d87cf849ffbff0240d70400.png)
都可以检测到。
2、滑动的速度检测
在onTouchEvent(这个是属于View的,你也可以在GestureDetector.OnGestureListener接口中写)中我们可以加入速度检测的代码:
VelocityTracker obtain = VelocityTracker.obtain();
obtain.addMovement(event);
obtain.computeCurrentVelocity(100);
int xVelocity = (int) obtain.getXVelocity();
int yVelocity = (int) obtain.getYVelocity();
obtain.clear();
obtain.recycle();
Log.i(TAG, "onTouchEvent:x速度: "+xVelocity);
Log.i(TAG, "onTouchEvent:y速度: "+yVelocity);
这样手势滑动的时候就可以检测到速度,这里我设置的时间是100ms。速度=(终点位置-起点位置)/时间段
![](https://i-blog.csdnimg.cn/blog_migrate/e69f0e6626bb2134284a034d93a2ae41.png)
其中上下左右的滑动不同,速度值为正负;