当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等。
一般情况下,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouch(View v, MotionEvent event)方法,我们可以处理一些touch事件,但是这个方法太过简单,如果需要处理一些复杂的手势,用这个接口就会很麻烦(因为我们要自己根据用户触摸的轨迹去判断是什么手势)。
Android sdk给我们提供了GestureDetector(Gesture:手势Detector:识别)类,通过这个类我们可以识别很多的手势,主要是通过他的onTouchEvent(event)方法完成了不同手势的识别。虽然他能识别手势,但是不同的手势要怎么处理,应该是提供给程序员实现的。
要使用GestureDetector,有三步要走:
1. 创建OnGestureListener监听函数
2.创建GestureDetector实例
3.onTouch(View v, MotionEvent event)中拦截
listener = new OnGestureListener() {
public boolean onSingleTapUp(MotionEvent arg0) {
// TODO Auto-generated method stub
//一次单独的轻击抬起操作,也就是轻击一下屏幕,立刻抬起来,才会有这个触发,当然,如果除了Down以外还有其它操作,那就不再算是Single操作了,所以也就不会触发这个事件
return false;
}
public void onShowPress(MotionEvent arg0) {
// TODO Auto-generated method stub
//如果是按下的时间超过瞬间,而且在按下的时候没有松开或者是拖动的,那么onShowPress就会执行,具体这个瞬间是多久,我也不清楚呃……
}
public boolean onScroll(MotionEvent arg0, MotionEvent arg1,
float arg2, float arg3) {
// TODO Auto-generated method stub
//在屏幕上拖动事件。无论是用手拖动view,或者是以抛的动作滚动,都会多次触发,这个方法
return false;
}
public void onLongPress(MotionEvent arg0) {
// TODO Auto-generated method stub
//长按触摸屏,超过一定时长,就会触发这个事件
}
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {
// TODO Auto-generated method stub
//滑屏,用户按下触摸屏、快速移动后松开
return true;
}
public boolean onDown(MotionEvent arg0) {
// TODO Auto-generated method stub
//用户按下屏幕就会触发;
return false;
}
};
gestureDetector = new GestureDetector(CigaretteListActivity.this,
listener);
listView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
gestureDetector.onTouchEvent(event);
return false;
}
});
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
CigaretteUrl cigaretteUrl = (CigaretteUrl) parent
.getItemAtPosition(position);
Intent intent = new Intent(ac, CigaretteDetailsActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("cigaretteUrl", cigaretteUrl);
intent.putExtras(bundle);
startActivity(intent);
}
});