用户手势检测-GestureDetector使用详解

一.概述

当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等。
一般情况下,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouch(View v, MotionEvent event)方法,我们可以处理一些touch事件,但是这个方法太过简单,如果需要处理一些复杂的手势,用这个接口就会很麻烦(因为我们要自己根据用户触摸的轨迹去判断是什么手势)。
Android sdk给我们提供了GestureDetector(Gesture:手势Detector:识别)类,通过这个类我们可以识别很多的手势,主要是通过他的onTouchEvent(event)方法完成了不同手势的识别。虽然他能识别手势,但是不同的手势要怎么处理,应该是提供给程序员实现的。

GestureDetector提供了一个内部类SimpleOnGestureListener,可以很方便的实现手势检测,我们可以继承这个类,重写里面的方法。

二.实现

要使用GestureDetector,需要三步:
(1)创建OnGestureListener监听函数:
可以构造实例:

GestureDetector.SimpleOnGestureListener listener = new SimpleOnGestureListener(){ }

也可以构造类:

class GestureListener extends SimpleOnGestureListener{

}

(2)使用构造函数:

GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.SimpleOnGestureListener listener);

(3)拦截触摸事件:

public boolean onTouch(View v, MotionEvent event) { 
         return gestureDetector.onTouchEvent(event);
    }

或者

  @Override
    public boolean onTouchEvent(MotionEvent event) {
        gestureDetector.onTouchEvent(event);
        return super.onTouchEvent(event);
    }

三.例子

下面上给大家举一个应用的例子,使用onFling方法判断当前是向右还是向左划动,其他方法如果你有兴趣的话自己可以去研究一下,这里就不讲了。

先上布局文件

<RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.hecun.myapplication.MainActivity">

    <TextView  android:id="@+id/textview" android:textColor="#ffffff" android:textSize="25sp" android:background="#9e9e9e" android:gravity="center" android:text="请滑动" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="40dp" />
</RelativeLayout>
public class MainActivity extends Activity /*implements OnTouchListener */{
    private TextView textView;
    private GestureDetector gestureDetector;
    //滑动最小距离
    public static final int FLING_MIN_DISTANCE = 50;
    //滑动最小速度
    public static final int FLING_MIN_VELOCITY = 50;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.textview);
        gestureDetector = new GestureDetector(this, new GestureListener ());
        //必须设置,否则无法响应触摸,因为textview默认是不可点击的
// textView.setClickable(true);
// textView.setOnTouchListener(this);
    }

    class GestureListener  extends SimpleOnGestureListener {
        /** * 用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, * 多个ACTION_MOVE, 1个ACTION_UP触发 * 参数解释: e1:第1个ACTION_DOWN MotionEvent e2:最后一个ACTION_MOVE MotionEvent velocityX:X轴上的移动速度,像素/秒 velocityY:Y轴上的移动速度,像素/秒 */
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                float velocityY) {
            if (e1.getRawX() - e2.getRawX() > FLING_MIN_DISTANCE
                    && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
                textView.setText("你向左滑动");
            } else if (e2.getRawX() - e1.getRawX() > FLING_MIN_DISTANCE
                    && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
                textView.setText("你向右滑动");
            }
            return super.onFling(e1, e2, velocityX, velocityY);
        }
    }

    /* @Override public boolean onTouch(View v, MotionEvent event) { return gestureDetector.onTouchEvent(event); }*/
    /** * 拦截触摸事件 */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        gestureDetector.onTouchEvent(event);
        return super.onTouchEvent(event);
    }
}

你可能感兴趣的:(用户手势检测-GestureDetector使用详解)