对于触摸屏的事件无非是按下、移动、抬起,如果是处理这几种简单的操作,使用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,否则有些手势无效。