牛骨文教育服务平台(让学习变的简单)

GestureDetector(手势识别器)

(1)手势交互过程原理:

A.触屏一刹那,触发 MotionEvent事件;

B.上述事件被 OnTouchListenter 监听,在 nTouch() 中获得 MotionEvent对象;

C.GestureDetector 转发MotionEvent对象至 OnGestureListenter;

D.OnGestureListenter 获得该对象,根据该对象封装的信息作出合适的反馈;

(2)MotionEvent:

1)、用于封装手势等动作事件;

2)、内部封装用于记录横轴和纵轴坐标的属性X和Y;

GestureDetector:

1)、识别各种手势;

OnGestureListenter:

1)、手势交互的监听接口,其提供多个抽象方法;

2)、根据GestureDetector的手势识别结果调用相对应的方法;

(3)GestureDetector工作原理:

1)、GestureDetector.OnGestureListener接口

onDown(MotionEvent e):——单击

Notified when a tap occurs with the down MotionEvent that triggered it.

onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY):——滑动

Notified of a fling event when it occurs with the initial on down MotionEvent and the matching up MotionEvent.

onLongPress(MotionEvent e):——长按

Notified when a long press occurs with the initial on down MotionEvent that trigged it.

onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY):——滚动

Notified when a scroll occurs with the initial on down MotionEvent and the current move MotionEvent.

onShowPress(MotionEvent e):——短按

The user has performed a down MotionEvent and not performed a move or up yet.

onSingleTapUp(MotionEvent e):——抬起

Notified when a tap occurs with the up MotionEvent that triggered it. 

2)、GestureDetector.OnDoubleTapListener接口

onDoubleTap(MotionEvent e):——双击**

Notified when a double-tap occurs.

onDoubleTapEvent(MotionEvent e):——双击按下和抬起各触发一次

Notified when an event within a double-tap gesture occurs, including the down, move, and up events.

onSingleTapConfirmed(MotionEvent e):——单击确认(即很快的按下并抬起,但并不连续点击第二下)

Notified when a single-tap occurs.

3)、GestureDetector.SimpleOnGestureListener类

其实我们并不需要处理上面所有手势。问了方便起见,Android提供了另外一个类SimpleOnGestureListener。它实现了如上接口,我们只需要继承SimpleOnGestureListener类,然后重载感兴趣的手势。 implements GestureDetector.OnGestureListener GestureDetector. OnDoubleTapListenerGestureDetector. OnContextClickListener。A convenience class to extend when you only want to listen for a subset of all the gestures. This implements all methods in  the  [GestureDetector.OnGestureListener](http://developer.android.com/reference/android/view/GestureDetector.OnGestureListener.html),  [GestureDetector.OnDoubleTapListener](http://developer.android.com/reference/android/view/GestureDetector.OnDoubleTapListener.html), and[GestureDetector.OnContextClickListener](http://developer.android.com/reference/android/view/GestureDetector.OnContextClickListener.html) but does nothing and returnfalse for all applicable methods.

public class MainActivity extends Activity {

	private ImageView imageView;
	private GestureDetector mygestureDetector;

	// 继承SimpleOnGestureListener类,然后重载感兴趣的手势。
	class MyGestureListenter extends SimpleOnGestureListener {

		@Override
		// 重载滑动手势
		public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
				float velocityY) {
			if (e1.getX() - e2.getX() > 50) {
				Toast.makeText(MainActivity.this, "从右往左滑动", Toast.LENGTH_SHORT)
						.show();
			} else if (e2.getX() - e1.getX() > 50) {
				Toast.makeText(MainActivity.this, "从左往右滑动", Toast.LENGTH_SHORT)
						.show();
			}
			return super.onFling(e1, e2, velocityX, velocityY);
		}

	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		/*
		 * GestureDetector工作原理 
		 * 1、当接收到用户触摸消息时,将消息交给GestureDetector加工;
		 * 2、通过设置监听器获得GestureDetector处理后的手势; 
		 * 3、GestureDetector提供两个监听器:
		 *     A.OnGestureListenter:处理单击类消息;
		 *     B.OnDoubleTapListenter:处理双击类消息;
		 */
		imageView = (ImageView) findViewById(R.id.img);
		mygestureDetector = new GestureDetector(new MyGestureListenter());

		// MotionEvent——》setOnTouchListener捕获
		// ——》onTouch中GestureDetector对象将监听事件转发给MyGestureListenter(extends SimpleOnGestureListener)
		// ——》MyGestureListenter类中实现了要重载的手势
		imageView.setOnTouchListener(new OnTouchListener() {

			@Override
			// 可以捕获触摸屏幕发生的Event
			public boolean onTouch(View v, MotionEvent event) {
				// TODO Auto-generated method stub
				mygestureDetector.onTouchEvent(event); // 转发event事件,转发给MyGestureListenter(extends SimpleOnGestureListener)
				return false;
			}
		});
	}

	//消除冲突
	/*@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		// TODO Auto-generated method stub
		if(mygestureDetector!=null){
			if(mygestureDetector.onTouchEvent(ev)){
				return true;
			}
		}
		return super.dispatchTouchEvent(ev);
	}*/
	
	//必须重写onTouchEvent方法,onFling才生效
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		// TODO Auto-generated method stub
		return mygestureDetector.onTouchEvent(event);
	}
}

为了让onFling才生效,必须重写onTouchEvent方法!