手势检测
-
当用户触摸屏幕的时候,会产生很多的手势,如up,down,scroll, fling等
-
处理简单的手势:
- View类有一个View.onTouchLiatener内部接口,通过重写他的onTouch(View view, MotionEvent event)函数,可以处理一些touch事件,但是这个函数只限于处理简单手势
-
处理复杂手势:
- Android SDK提供给我们一些GestureDetector(手势检测)类
- GestureDetector对外提供两个接口OnGestureListener和OnDoubleTapListener 和一个外部类SimpleOnGestureListener(其实是上面的两个接口的所有函数的集成,它包含这两个接口中的所有函数,而且都已经被重写,但是所有的函数体都是空的,同时该类是一个静态类)
GestureDetector.OnGestureListener接口
- 基本讲解:
- 如果我们写一个类并继承自OnGestureListener,则会提示有几个必须重写的函数
public class gestureListener implements GestureDetector.OnGestureListener{
//用户按下屏幕就会触发的函数
@Override
public boolean onDown(MotionEvent e) {
return false;
}
//如果按下的时间超过瞬时,而且在按下的时候没有松开或者是拖动的,该函数就会触发
@Override
public void onShowPress(MotionEvent e) {
}
//一次单独的轻击抬起操作,轻击以下屏幕立即抬起来就会触发这个函数
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
//在屏幕上拖动事件,无论是使用手指进行拖动还是以抛的动作进行滚动,都会多次出发这个函数,在ACTION_MOVE动作发生的时候就会触发该函数
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
//长按触摸屏,超过一定的时长,就会触发这个函数
@Override
public void onLongPress(MotionEvent e) {
}
//滑屏,用户按下触摸屏,快速移动后松开,有一个MotionEvent ACTION_DOWN、多个ACTION_MOVE、一个ACTION_UP触发
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return false;
}
}
-
触发的顺序:
- onDown()->onShowPress()->onLongPress()
-
单击一下非常快的(不滑动)Touchup,触发顺序:
- onDown()->onSingleTapUp()->onSingleTapConfirmed()
-
单击一下稍微慢点的(不滑动)Touchup,触发顺序为:
- onDown()->onShowPress()->onSingleTapUp()->onSingleTapConfirmed()
-
无论是如何滑动,只是中间的onScroll()的个数不同而已,最终都会触发onFling()
-
滑屏,即手指触动屏幕后,稍微滑动后立即松开,触发顺序为
- onDown()->onScroll()->onScroll()->onScroll()->…->onFling()
-
拖动触发顺序
- onDown()->onScroll()->onScroll()->onFling()
使用GestureDetector
- 创建OnGestureListener()监听函数
GestureDetecror.OnGestureListener listener = new GestureDetector.OnGestureListener(){
};
private class gestureListener implements GestureDetector.OnGestureListener{
}
- 创建GestureDetector实例mGestureDetector
GestureDetector gestureDetector = new GestureDetector(GestureDetector.OnGestureListener listener);
GestureDetector gestureDetector = new GestureDetector(Context context, GestureDetector.OnGestureListener listener);
GestureDetector gestureDetector = new GestureDetector(Context context , GestureDetector.SimpleOnGestureListener listener)
- 在OnTouch()中进行拦截:
public boolean onTouch(View v, MotionEvent event){
return mGEstureDetector.OnTouchEvent(event);
}
- 绑定控件:
TextView textView = (TextView)findViewById(R.id.tv);
textView.setOnTouchListener(this);
eg:
public class GEstureDetectorTestActivity extends Activity implements View.OnTouchListener {
private TextView textView;
private GestureDetector gestureDetector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_gesture_detector_test);
gestureDetector = new GestureDetector(new gestureListener());
textView = (TextView)findViewById(R.id.tv_gesture);
textView.setOnTouchListener(GEstureDetectorTestActivity.this);
textView.setFocusable(true);
textView.setClickable(true);
textView.setLongClickable(true);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
private class gestureListener implements GestureDetector.OnGestureListener{
@Override
public boolean onDown(MotionEvent e) {
System.out.println("onDown");
return true;
}
@Override
public void onShowPress(MotionEvent e) {
System.out.println("onShowPress");
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
System.out.println("onSingleTapUp");
return true;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
System.out.println("onScroll");
return true;
}
@Override
public void onLongPress(MotionEvent e) {
System.out.println("onLongPress");
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
System.out.println("onFling");
return true;
}
}
}
GestureDetector.OnDoubleTapListener接口
- 构建:
- 方法一:新建一个测试类,同时派生自OnGestureListener和OnDoubleTapListener
private class gestureListener im[lements GestureDetector.OnGestureListener, GestureDetecor.OnDoubleTapListener{
}
- 方法二:使用GestureDetector.setOnDoubleTapListener()函数设置双击监听
gestureDetector = new GestureDetector(new gestureListener());
private class gestureListener implements GestureDetector.OnGestureListener{
}
//设置双击监听
gestureDetector.setOnDoubleTapListener(new doubleTapListener());
private class doubleTapListener implements GestureDetector.OnDoubleTapListener{
}
OnDoubleTapListener()函数讲解:
//单击事件,用来判定该次单击是singleTap,而不是doubleTap,如果连续单击两次,就是doubleTap, 如果只进行单击一次,系统等待一段时间,如果没有第二次单击,那么就会判定为SingleTap而不是DoubleTap, 然后触发SingleTapConfirmed事件,触发顺序是onDown()->onSingleTapUp()->onSingleTapConfirmed()。
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
return false;
}
//双击事件
@Override
public boolean onDoubleTap(MotionEvent e) {
return false;
}
//双击间隔中发生的动作,指在触发onDoubleTap以后,在双击之间发生的其他动作,包含down、up、move事件
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
return false;
}
eg:
private TextView textView;
private GestureDetector gestureDetector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_gesture_detector_test);
gestureDetector = new GestureDetector(new gestureListener());
gestureDetector.setOnDoubleTapListener(new doubleTapListener());
textView = (TextView)findViewById(R.id.tv_gesture);
textView.setOnTouchListener(GEstureDetectorTestActivity.this);
textView.setFocusable(true);
textView.setClickable(true);
textView.setLongClickable(true);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
private class gestureListener implements GestureDetector.OnGestureListener{
@Override
public boolean onDown(MotionEvent e) {
System.out.println("onDown");
return true;
}
@Override
public void onShowPress(MotionEvent e) {
System.out.println("onShowPress");
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
System.out.println("onSingleTapUp");
return true;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
System.out.println("onScroll");
return true;
}
@Override
public void onLongPress(MotionEvent e) {
System.out.println("onLongPress");
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
System.out.println("onFling");
return true;
}
}
private class doubleTapListener implements GestureDetector.OnDoubleTapListener{
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
System.out.println("onSimgleTapConfirmed");
return true;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
System.out.println("onDoubleTap");
return true;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
//结果0表示ACTION_DOWN, 1表示ACTION_UP, 2表示ACTION_MOVE
System.out.println("onDoubleTapEvent" + e.getAction());
return true;
}
}
}