Android学习之手势识别(GestureDetector)

    对于触摸屏的事件无非是按下、移动、抬起,如果是处理这几种简单的操作,使用OnTouch就可以完成,但是为了提高用户体验,识别复杂的手势,Android给我们提供的手势识别工具GestureDetector就可以帮上大忙了。

    要使用GestureDetector,需要实现OnGestureListener这个接口:

  //当用户按下时触发,由1个MotionEvent ACTION_DOWN触发 
  abstract boolean onDown(MotionEvent e);

  // 用户(轻触触摸屏后)松开,由一个1个MotionEvent ACTION_UP触发
  abstract boolean onSingleTapUp(MotionEvent e);  

   // 用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEvent ACTION_DOWN触发
    // 注意和onDown()的区别,强调的是没有松开或者拖动的状态
  abstract void onShowPress(MotionEvent e);

  // 用户长按触摸屏,由多个MotionEvent ACTION_DOWN触发
  abstract void onLongPress(MotionEvent e);

  // 用户按下触摸屏,并拖动,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE触发
  abstract boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY);

  // 用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发
  abstract boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY); 

   下面就以一个简单的识别用户左右滑动为例: 

public class MainActivity extends Activity implements OnTouchListener,OnGestureListener{

    private GestureDetector gesture;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        TextView tv = (TextView) this.findViewById(R.id.textView1);
        tv.setOnTouchListener(this);
        tv.setLongClickable(true);
        gesture = new GestureDetector(this, this);
    }

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

    @Override
    public boolean onDown(MotionEvent e) {
        return false;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
    
        if(e1.getX() > e2.getX()){
            Toast.makeText(this, "用户手势往左边滑动", 3000).show();
        }else{
            Toast.makeText(this, "用户手势往右边滑动", 3000).show();
        }
        return false;
    }

    @Override
    public void onLongPress(MotionEvent e) {       
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
            float distanceY) {
        return false;
    }

    @Override
    public void onShowPress(MotionEvent e) {
    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        return false;
    }
}

 效果图:

注意:必须要设置你手势识别的View的LongClickable为true,否则有些手势无效。

posted @ 2013-01-28 14:12  左眼跳跳  阅读(368)  评论(0编辑  收藏  举报