天天看點

GestureDetector和SimpleOnGestureListener的使用教程

原文:http://www.cnblogs.com/transmuse/archive/2010/12/2.html

1. 當使用者觸摸螢幕的時候,會産生許多手勢,例如down,up,scroll,filing等等,我們知道view類有個view.ontouchlistener内部接口,通過重寫他的ontouch(view v,motionevent event)方法,我們可以處理一些touch事件,但是這個方法太過簡單,如果需要處理一些複雜的手勢,用這個接口就會很麻煩(因為我們要自己根據使用者觸摸的軌迹去判斷是什麼手勢)android

sdk給我們提供了gesturedetector(gesture:手勢detector:識别)類,通過這個類我們可以識别很多的手勢,主要是通過他的ontouchevent(event)方法完成了不同手勢的識别。雖然他能識别手勢,但是不同的手勢要怎麼處理,應該是提供給程式員實作的,是以這個類對外提供了兩個接口:ongesturelistener,ondoubletaplistener,還有一個内部類simpleongesturelistener,simpleongesturelistener類是gesturedetector提供給我們的一個更友善的響應不同手勢的類,這個類實作了上述兩個接口(但是所有的方法體都是空的),該類是static

class,也就是說它實際上是一個外部類。程式員可以在外部繼承這個類,重寫裡面的手勢處理方法。

通過gesturedetector的構造方法可以将simpleongesturelistener對象傳遞進去,這樣gesturedetector能處理不同的手勢了。

2. 具體用法:

2.1

2.2

   public gesturedetector (context context, gesturedetector.ongesturelistener

listener)     //通過構造方法将手勢響應交給手勢識别類

2.3

   在ontouchlistener的ontouch方法中

ok,到此為止就結束了.

3.案例:

4.遇到的問題:

1. onfling(***)無法觸發

通過設定 mlistview.setlongclickable(true);即可(我處理的是listview的手勢事件),隻有這樣,view才能夠處理不同于tap(輕觸)的hold(即action_move,或者多個action_down),我們同樣可以通過layout定義中的android:longclickable來做到這一點。

2. 使用者長按手機螢幕,就會觸發長按事件,離開螢幕時,就會觸發up事件,但是simpleongesturelistener沒有對longpress事件的up事件對外提供接口

解決辦法:

類似于這樣,截獲up事件,因為所有的都是有ontouchlistener 先獲得,然後傳遞給simpleongesturelistener的,這裡有一點必須要注意:

截獲到up事件,我們進行了處理後,必須要将這個事件再交給simpleongesturelistener處理,雖然我們隻截獲長按事件的up,但是simpleongesturelistener對于長按事件的up也做了一些處理,隻是沒有對外提供接口。

做了什麼處理: 

如果不交給simpleongesturelistener處理,那麼單擊動作也會觸發onlongpress方法。

總結:

1. 點選螢幕上的某項的執行流程 有兩種情況,一種是時間很短,一種時間稍長

時間很短:ondown——–》onsingletapup——–》onsingletapconfirmed

時間稍長:ondown——–》onshowpress——》onsingletapup——–》onsingletapconfirmed

2. 長按事件

ondown——–》onshowpress——》onlongpress

3.抛:手指觸動螢幕後,稍微滑動後立即松開

ondown—–》onscroll—-》onscroll—-》onscroll—-》………—–>onfling

4.拖動

ondown——》onscroll—-》onscroll——》onfiling

注意:有的時候會觸發onfiling,但是有的時候不會觸發,個人了解是人的動作不标準所緻。

繼續閱讀