1、触摸手势
1、1介绍
当用户把用一根或多根手指放在触摸屏上,并且应用把这样的触摸方式解释为特定的手势时,“触摸手势”就发生了。相应地,检测手势也就有以下两个阶段:
- 收集触摸事件的相关数据。
- 分析这些数据,看它们是否符合app所支持的手势的标准。
1、2 “触摸手势”有哪些
短按
长按
滑动
滑屏(快速滑动,还有一个惯性的过程)
双击
2、收集数据
当用户第一次触摸屏幕时,手势就开始了。其后系统会持续地追踪用户手指的位置,在用户手指全都离开屏幕时,手势结束。在整个交互期间,被分发给 onTouchEvent() 函数的 MotionEvent 对象,提供了每次交互的详细信息。
2.1、为Activity或View捕获触摸事件
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监听函数,实现“触摸手势”分类;
扫描二维码关注公众号,回复:
1886793 查看本文章
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; }