原文: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,但是有的時候不會觸發,個人了解是人的動作不标準所緻。