新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > GestureDetector類及其用法

        GestureDetector類及其用法

        作者: 時間:2016-10-08 來源:網絡 收藏

        當用戶觸摸屏幕的時候,會產生許多手勢,例如down,up,scroll,filing等等。

        本文引用地址:http://www.104case.com/article/201610/305615.htm

        一般情況下,我們知道View類有個View.OnTouchListener內部接口,通過重寫他的onTouch(View v, MotionEvent event)方法,我們可以處理一些touch事件,但是這個方法太過簡單,如果需要處理一些復雜的手勢,用這個接口就會很麻煩(因為我們要自己根據用戶觸摸的軌跡去判斷是什么手勢)。

        Android sdk給我們提供了GestureDetector(Gesture:手勢Detector:識別)類,通過這個類我們可以識別很多的手勢,主要是通過他的onTouchEvent(event)方法完成了不同手勢的識別。雖然他能識別手勢,但是不同的手勢要怎么處理,應該是提供給程序員實現的。

        GestureDetector這個類對外提供了兩個接口:OnGestureListener,OnDoubleTapListener,還有一個內部類SimpleOnGestureListener。

        GestureDetector.OnDoubleTapListener接口:用來通知DoubleTap事件,類似于鼠標的雙擊事件。

        1,onDoubleTap(MotionEvent e):在雙擊的第二下,Touch down時觸發 。

        2,onDoubleTapEvent(MotionEvent e):通知DoubleTap手勢中的事件,包含down、up和move事件(這里指的是在雙擊之間發生的事件,例如在同一個地方雙擊會產生DoubleTap手勢,而在DoubleTap手勢里面還會發生down和up事件,這兩個事件由該函數通知);雙擊的第二下Touch down和up都會觸發,可用e.getAction()區分。

        3,onSingleTapConfirmed(MotionEvent e):用來判定該次點擊是SingleTap而不是DoubleTap,如果連續點擊兩次就是DoubleTap手勢,如果只點擊一次,系統等待一段時間后沒有收到第二次點擊則判定該次點擊為SingleTap而不是DoubleTap,然后觸發SingleTapConfirmed事件。這個方法不同于onSingleTapUp,他是在GestureDetector確信用戶在第一次觸摸屏幕后,沒有緊跟著第二次觸摸屏幕,也就是不是“雙擊”的時候觸發

        GestureDetector.OnGestureListener接口:用來通知普通的手勢事件,該接口有如下六個回調函數:

        1. onDown(MotionEvent e):down事件;

        2. onSingleTapUp(MotionEvent e):一次點擊up事件;在touch down后又沒有滑動

        (onScroll),又沒有長按(onLongPress),然后Touchup時觸發。

        點擊一下非常快的(不滑動)Touchup:

        onDown->onSingleTapUp->onSingleTapConfirmed

        點擊一下稍微慢點的(不滑動)Touchup:

        onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed

        3. onShowPress(MotionEvent e):down事件發生而move或則up還沒發生前觸發該

        事件;Touch了還沒有滑動時觸發(與onDown,onLongPress)比較onDown只要Touch down一定立刻觸發。而Touchdown后過一會沒有滑動先觸發onShowPress再是onLongPress。所以Touchdown后一直不滑動

        按照onDown->onShowPress->onLongPress這個順序觸發。

        4. onLongPress(MotionEvent e):長按事件;Touch了不移動一直Touch down時觸發

        5. onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY):滑動手

        勢事件;Touch了滑動一點距離后,在ACTION_UP時才會觸發

        參數:e1 第1個ACTION_DOWN MotionEvent 并且只有一個;e2 最后一個ACTION_MOVE MotionEvent ;velocityX X軸上的移動速度,像素/秒 ;velocityY Y軸上的移動速度,像素/秒.觸發條件:X軸的坐標位移大于FLING_MIN_DISTANCE,且移動速度大于FLING_MIN_VELOCITY個像素/秒

        6. onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY):在屏幕上

        拖動事件。無論是用手拖動view,或者是以拋的動作滾動,都會多次觸發,這個方法在ACTION_MOVE動作發生時就會觸發

        拋:手指觸動屏幕后,稍微滑動后立即松開

        onDown-----》onScroll----》onScroll----》onScroll----》………----->onFling

        拖動

        onDown------》onScroll----》onScroll------》onFiling

        SimpleOnGestureListener類是GestureDetector提供給我們的一個更方便的響應不同手勢的類,這個類實現了上述兩個接口(但是所有的方法體都是空的),該類是static class,也就是說它實際上是一個外部類。程序員可以在外部繼承這個類,重寫里面的手勢處理方法。

        方法步驟

        第一種示例:

        1,通過GestureDetector的構造方法可以將SimpleOnGestureListener對象傳遞進去,這樣GestureDetector能處理不同的手勢了。

        public GestureDetector

        (Context context, GestureDetector.OnGestureListener listener)

        2,在OnTouchListener的onTouch方法中

        private OnTouchListener gestureTouchListener = new OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {

        return gDetector.onTouchEvent(event);

        }

        };

        第二種示例:

        使用方法

        private GestureDetector mGestureDetector;

        mGestureListener = new BookOnGestureListener();

        構造出來mGestureDetector = new GestureDetector(mGestureListener);

        class BookOnGestureListener implements OnGestureListener {

        同時要public boolean onTouchEvent(MotionEvent event) {

        mGestureListener.onTouchEvent(event);

        }

        第三種示例代碼

        代碼:

        01.private GestureDetector mGestureDetector;

        02.@Override

        03.public void onCreate(Bundle savedInstanceState) {

        04. super.onCreate(savedInstanceState);

        05. mGestureDetector = new GestureDetector(this, new LearnGestureListener());

        06.}

        07.@Override

        08.public boolean onTouchEvent(MotionEvent event) {

        09. if (mGestureDetector.onTouchEvent(event))

        10. return true;


        上一頁 1 2 下一頁

        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 明溪县| 高要市| 南投市| 河东区| 沂南县| 读书| 罗平县| 临猗县| 沧源| 泸州市| 阿图什市| 通州市| 桃园县| 沽源县| 额敏县| 泽库县| 姚安县| 商洛市| 江永县| 宁海县| 合作市| 兴山县| 武强县| 简阳市| 乌审旗| 晴隆县| 双辽市| 青海省| 克什克腾旗| 桑植县| 岳普湖县| 汶上县| 天柱县| 阿勒泰市| 泗阳县| 平远县| 资阳市| 潼南县| 广汉市| 金堂县| 崇州市|