当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等。
一般情况下,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouch(View v, MotionEvent event)方法,我们可以处理一些touch事件,但是这个方法太过简单,如果需要处理一些复杂的手势,用这个接口就会很麻烦(因为我们要自己根据用户触摸的轨迹去判断是什么手势)。
Android sdk给我们提供了GestureDetector(Gesture:手势Detector:识别)类,通过这个类我们可以识别很多的手势,主要是通过他的onTouchEvent(event)方法完成了不同手势的识别。虽然他能识别手势,但是不同的手势要怎么处理,应该是提供给程序员实现的
先定义private GestureDetector gesturedetector;
设置在图片上侧滑
iv = (ImageView) v.findViewById(R.id.introduction);
iv.setOnTouchListener(new View.OnTouchListener() {
@Override
通过onTouch()函数可以获取基本的触屏事件
public boolean onTouch(View v, MotionEvent event) {
将触屏事件交给GestureDetector处理
gesturedetector.onTouchEvent(event);
return true;
}
});
class MyonGestureListener extends GestureDetector.SimpleOnGestureListener{
@Override
onFling是抛,飞一般的滑动,前两个参数和onScroll相同,e2为用户拖动完离开屏幕时的点。veloctiyX,velocitY为离开屏幕时的初始速度,以这两个速度为初始速度做匀减速运动
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if (velocityX > 0) {
gotoMain();
return true;
}
return false;
这些返回值会通过 mGestureDetector.onTouchEvent(event); 传递给onTouch。
}
@Override
e1为第一次按下的事件,和onDown事件里面的一样,e2为当前的事件,distanceX为本次onScroll移动的X轴距离,distanceY为移动的Y轴距离,移动的距离是相对于上一次onScroll事件的移动距离,而不是当前点和按下点的距离。这次滑动最后触发了onFling事件,但是onFling事件的触发不是一定的,onFling是在ACTION_UP触发,平时列表在离开屏幕是继续滚动,就是通过这种方式触发。
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
if (Math.abs(distanceX) > Math.abs(distanceY) && distanceX > 0) {
gotoMain();
return true;
}
return false;
}
private void gotoMain(){
getApp().getPreferences().setBoolean(Preferences.KEY_FIRST_USE, false);
startActivity(new Intent(getActivity(), MainActivity.class));
getActivity().finish();
}
}