使用触摸手势

1、触摸手势

1、1介绍

当用户把用一根或多根手指放在触摸屏上,并且应用把这样的触摸方式解释为特定的手势时,“触摸手势”就发生了。相应地,检测手势也就有以下两个阶段:

  1. 收集触摸事件的相关数据。
  2. 分析这些数据,看它们是否符合app所支持的手势的标准。

1、2 “触摸手势”有哪些

短按

长按

滑动

滑屏(快速滑动,还有一个惯性的过程)

双击


2、收集数据

当用户第一次触摸屏幕时,手势就开始了。其后系统会持续地追踪用户手指的位置,在用户手指全都离开屏幕时,手势结束。在整个交互期间,被分发给 onTouchEvent() 函数的 MotionEvent 对象,提供了每次交互的详细信息。

2.1、为Activity或View捕获触摸事件

为了捕获Activity或View中的触摸事件,我们可以重写 onTouchEvent() 回调函数。

2.2、捕获单个view的触摸事件


3、检测手势

Android提供了GestureDetector.OnGestureListener、GestureDetector.OnDoubleTapListener类来检测常用的手势。它所支持的手势包括onDown()onLongPress()onFling() 等。我们可以把GestureDetector和上面描述的onTouchEvent()函数结合在一起使用。

3.1、检测所有支持的手势

3.2、检测部分支持的手势



4、举例

4.1 步骤

要使用GestureDetector,有三步要走:

1、创建GestureDetector实例mGestureDetector;
2、onTouch(View v, MotionEvent event)中拦截;

3、创建OnGestureListener监听函数,实现“触摸手势”分类;


4.2 demo

1、创建GestureDetector实例mGestureDetector;

private GestureDetectorCompat mDetector;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mDetector = new GestureDetectorCompat(this,this);
    mDetector.setOnDoubleTapListener(this);
}

2、onTouch(View v, MotionEvent event)中拦截;

@Override
public boolean onTouchEvent(MotionEvent event){
    this.mDetector.onTouchEvent(event);
    // Be sure to call the superclass implementation
    return super.onTouchEvent(event);
}

3、创建OnGestureListener监听函数,实现“触摸手势”分类;

@Override
public boolean onDown(MotionEvent event) {
    Log.d(DEBUG_TAG,"onDown: " + event.toString()+ ">>>>>>>>短按");
    return true;
}

@Override
public void onLongPress(MotionEvent event) {
    Log.d(DEBUG_TAG, "onLongPress: " + event.toString() + ">>>>>>>>长按");
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
                        float distanceY) {
    Log.d(DEBUG_TAG, "onScroll: " + e1.toString()+e2.toString() + ">>>>>>>>滑动");
    return true;
}
@Override
public boolean onSingleTapUp(MotionEvent event) {
    Log.d(DEBUG_TAG, "onSingleTapUp: " + event.toString() + ">>>>>>>>单击");
    return true;
}

@Override
public boolean onDoubleTap(MotionEvent event) {
    Log.d(DEBUG_TAG, "onDoubleTap: " + event.toString() + ">>>>>>>>双击");
    return true;
}
final int FLING_MIN_DISTANCE = 100, FLING_MIN_VELOCITY = 200;
@Override
public boolean onFling(MotionEvent event1, MotionEvent event2,
                       float velocityX, float velocityY) {
    Log.d(DEBUG_TAG, "onFling: " + event1.toString()+event2.toString());
    if (event1.getX() - event2.getX() > FLING_MIN_DISTANCE
            && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
        // Fling left
        Log.d(DEBUG_TAG, "Fling left"+ ">>>>>>>>向左滑屏");
        Toast.makeText(MainActivity.this, "Fling Left", Toast.LENGTH_SHORT).show();
    } else if (event2.getX() - event1.getX() > FLING_MIN_DISTANCE
            && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
        // Fling right
        Log.d(DEBUG_TAG, "Fling right"+ ">>>>>>>>向右滑屏");
        Toast.makeText(MainActivity.this, "Fling Right", Toast.LENGTH_SHORT).show();
    }
    return true;
}

猜你喜欢

转载自blog.csdn.net/haobobo710/article/details/80891264