GestureDetector类可让咱们快速的处理手势事件,如点击,滑动等。
使用GestureDetector分三步:
1. 定义GestureDetector类
2. 初始化手势类,同时设置手势监听
3. 将touch事件交给gesture处理android
这里总共重写了六个函数,这些函数都在什么状况下才会触发呢,下面讲一下:app
OnDown(MotionEvent e):用户按下屏幕就会触发;
onShowPress(MotionEvent e):若是是按下的时间超过瞬间,并且在按下的时候没有松开或者是拖动的,那么onShowPress就会执行,具体这个瞬间是多久,我也不清楚呃……
onLongPress(MotionEvent e):长按触摸屏,超过必定时长,就会触发这个事件
触发顺序:
onDown->onShowPress->onLongPress
onSingleTapUp(MotionEvent e):从名子也能够看出,一次单独的轻击抬起操做,也就是轻击一下屏幕,马上抬起来,才会有这个触发,固然,若是除了Down之外还有其它操做,那就再也不算是Single操做了,因此也就不会触发这个事件
触发顺序:
点击一下很是快的(不滑动)Touchup:
onDown->onSingleTapUp->onSingleTapConfirmed
点击一下稍微慢点的(不滑动)Touchup:
onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed
onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) :滑屏,用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发
参数解释:
e1:第1个ACTION_DOWN MotionEvent
e2:最后一个ACTION_MOVE MotionEvent
velocityX:X轴上的移动速度,像素/秒
velocityY:Y轴上的移动速度,像素/秒
onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY):在屏幕上拖动事件。不管是用手拖动view,或者是以抛的动做滚动,都会屡次触发,这个方法 在ACTION_MOVE动做发生时就会触发
滑屏:手指触动屏幕后,稍微滑动后当即松开
onDown-----》onScroll----》onScroll----》onScroll----》………----->onFling
拖动
onDown------》onScroll----》onScroll------》onFilingide
可见,不管是滑屏,仍是拖动,影响的只是中间OnScroll触发的数量多少而已,最终都会触发onFling事件!函数
package com.guorentong.learn.myapplication; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.GestureDetector; import android.view.MotionEvent; public class MainActivity extends AppCompatActivity { protected static final float FLIP_DISTANCE = 50; GestureDetector mDetector; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { // TODO Auto-generated method stub return false; } @Override public void onShowPress(MotionEvent e) { // TODO Auto-generated method stub } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // TODO Auto-generated method stub return false; } @Override public void onLongPress(MotionEvent e) { // TODO Auto-generated method stub } /** * * e1 The first down motion event that started the fling. e2 The * move motion event that triggered the current onFling. */ @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (e1.getX() - e2.getX() > FLIP_DISTANCE) { Log.i("MYTAG", "向左滑..."); Intent intent = new Intent(MainActivity.this, Main2Activity.class); startActivity(intent); return true; } if (e2.getX() - e1.getX() > FLIP_DISTANCE) { Log.i("MYTAG", "向右滑..."); return true; } if (e1.getY() - e2.getY() > FLIP_DISTANCE) { Log.i("MYTAG", "向上滑..."); return true; } if (e2.getY() - e1.getY() > FLIP_DISTANCE) { Log.i("MYTAG", "向下滑..."); return true; } Log.d("TAG", e2.getX() + " " + e2.getY()); return false; } @Override public boolean onDown(MotionEvent e) { // TODO Auto-generated method stub return false; } }); } @Override public boolean onTouchEvent(MotionEvent event) { return mDetector.onTouchEvent(event); } }