# GestureDetector
GestureDetector類給我們提供了三個接口,一個外部類
OnGestureListener:接口,用來監聽手勢事件(6種)。
OnDoubleTapListener:接口,用來監聽雙擊事件。
OnContextClickListener:接口,外接設備,比如外接鼠標產生的事件(本文中我們不考慮)。
SimpleOnGestureListener:外部類,SimpleOnGestureListener其實上面三個接口中所有函數的集成,它包含了這三個接口里所有必須要實現的函數而且都已經重寫,但所有方法體都是空的。需要自己根據情況去重寫。
> OnGestureListener接口方法解釋:
>
~~~
public interface OnGestureListener {
/**
* 按下。返回值表示事件是否處理
*/
boolean onDown(MotionEvent e);
/**
* 短按(手指尚未松開也沒有達到scroll條件)
*/
void onShowPress(MotionEvent e);
/**
* 輕觸(手指松開)
*/
boolean onSingleTapUp(MotionEvent e);
/**
* 滑動(一次完整的事件可能會多次觸發該函數)。返回值表示事件是否處理
*/
boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY);
/**
* 長按(手指尚未松開也沒有達到scroll條件)
*/
void onLongPress(MotionEvent e);
/**
* 滑屏(用戶按下觸摸屏、快速滑動后松開,返回值表示事件是否處理)
*/
boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY);
}
~~~
> OnDoubleTapListener接口方法解釋:
>
~~~
public interface OnDoubleTapListener {
/**
* 單擊事件(onSingleTapConfirmed,onDoubleTap是兩個互斥的函數)
*/
boolean onSingleTapConfirmed(MotionEvent e);
/**
* 雙擊事件
*/
boolean onDoubleTap(MotionEvent e);
/**
* 雙擊事件產生之后手指還沒有抬起的時候的后續事件
*/
boolean onDoubleTapEvent(MotionEvent e);
}
~~~
> SimpleOnGestureListener實現了OnGestureListener、OnDoubleTapListener、OnContextClickListener。SimpleOnGestureListener里面的方法是是三個接口的集合。
>
### GestureDetector使用
GestureDetector的使用非常的簡單,分為三個步驟:
* 定義GestureDetector類,
~~~
private GestureDetector mGestureDetector;
~~~
* 將touch事件交給GestureDetector(onTouchEvent函數里面調用GestureDetector的onTouchEvent函數)。
~~~
@Override
public boolean onTouchEvent(MotionEvent event) {
return mGestureDetector.onTouchEvent(event);
}
~~~
* 處理SimpleOnGestureListener或者OnGestureListener、OnDoubleTapListener、OnContextClickListener三者之一的回調。
# ScaleGestureDetector
ScaleGestureDetector是用于處理縮放的工具類
ScaleGestureDetector類給提供了OnScaleGestureListener接口,來告訴我們縮放的過程中的一些回調。
> OnScaleGestureListener回調函數介紹
>
~~~
public interface OnScaleGestureListener {
/**
* 縮放進行中,返回值表示是否下次縮放需要重置,如果返回ture,那么detector就會重置縮放事件,如果返回false,detector會在之前的縮放上繼續進行計算
*/
public boolean onScale(ScaleGestureDetector detector);
/**
* 縮放開始,返回值表示是否受理后續的縮放事件
*/
public boolean onScaleBegin(ScaleGestureDetector detector);
/**
* 縮放結束
*/
public void onScaleEnd(ScaleGestureDetector detector);
}
~~~
> ScaleGestureDetector類常用函數介紹,因為在縮放的過程中,要通過ScaleGestureDetector來獲取一些縮放信息。
>
~~~
/**
* 縮放是否正處在進行中
*/
public boolean isInProgress();
/**
* 返回組成縮放手勢(兩個手指)中點x的位置
*/
public float getFocusX();
/**
* 返回組成縮放手勢(兩個手指)中點y的位置
*/
public float getFocusY();
/**
* 組成縮放手勢的兩個觸點的跨度(兩個觸點間的距離)
*/
public float getCurrentSpan();
/**
* 同上,x的距離
*/
public float getCurrentSpanX();
/**
* 同上,y的距離
*/
public float getCurrentSpanY();
/**
* 組成縮放手勢的兩個觸點的前一次縮放的跨度(兩個觸點間的距離)
*/
public float getPreviousSpan();
/**
* 同上,x的距離
*/
public float getPreviousSpanX();
/**
* 同上,y的距離
*/
public float getPreviousSpanY();
/**
* 獲取本次縮放事件的縮放因子,縮放事件以onScale()返回值為基準,一旦該方法返回true,代表本次事件結束,重新開啟下次縮放事件。
*/
public float getScaleFactor();
/**
* 返回上次縮放事件結束時到當前的時間間隔
*/
public long getTimeDelta();
/**
* 獲取當前motion事件的時間
*/
public long getEventTime();
~~~
### ScaleGestureDetector使用
* 定義ScaleGestureDetector類
~~~
~~~