当用户把用一根或多根手指放在触摸屏上,并且应用把这样的触摸方式解释为特定的手势时,“触摸手势”就发生了。相应地,检测手势也就有以下两个阶段:
当用户第一次触摸屏幕时,手势就开始了。其后系统会持续地追踪用户手指的位置,在用户手指全都离开屏幕时,手势结束。在整个交互期间,被分发给 onTouchEvent() 函数的 MotionEvent 对象,提供了每次交互的详细信息。
为了捕获Activity或View中的触摸事件,我们可以重写onTouchEvent()回调函数。
Android提供了GestureDetector.OnGestureListener、GestureDetector.OnDoubleTapListener类来检测常用的手势。它所支持的手势包括onDown()、onLongPress()、onFling() 等。我们可以把GestureDetector和上面描述的onTouchEvent()函数结合在一起使用。
要使用GestureDetector,有三步要走:
1、创建GestureDetector实例mGestureDetector;
2、onTouch(View v, MotionEvent event)中拦截;
3、创建OnGestureListener监听函数,实现“触摸手势”分类;
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;
}