一、onTouchEvent和onTouch?
在java的繼承關(guān)系中奠涌,新的類(lèi)稱(chēng)為子類(lèi),也叫派生類(lèi)磷杏。
1.如果是直接重寫(xiě)父類(lèi)onTouchEvent的方法溜畅,那么這個(gè)事件是針對(duì)當(dāng)前整個(gè)頁(yè)面,點(diǎn)擊當(dāng)前頁(yè)面的任意位置极祸,這個(gè)方法都會(huì)被回調(diào)慈格,當(dāng)然點(diǎn)到某個(gè)擁有監(jiān)聽(tīng)事件的控件上面這個(gè)方法就無(wú)法回調(diào)。
1)這個(gè)方法最少都會(huì)被調(diào)用2次遥金,一次是按下浴捆,一次抬起。
2)當(dāng)你按住左右滑動(dòng)的時(shí)候onTouchEvent會(huì)被一直調(diào)用稿械,并且一直走到MotionEvent.ACTION_MOVE分支里面
3)如果點(diǎn)擊到某個(gè)擁有監(jiān)聽(tīng)事件的控件上面這個(gè)onTouchEvent就不會(huì)被回調(diào)了选泻。如下圖。
4)這個(gè)方法onTouchEvent的返回值要寫(xiě)成true美莫,原因以后驗(yàn)證页眯。
2.當(dāng)如果這個(gè)類(lèi)去實(shí)現(xiàn)這個(gè)接口,如圖厢呵。
1)會(huì)實(shí)現(xiàn)一個(gè)方法窝撵,onTouch(View view,MotionEvent motionEvent)
2)這個(gè)方法不是針對(duì)當(dāng)前頁(yè)面的,所以如下圖這樣才會(huì)引起回調(diào)襟铭。
3)這個(gè)回調(diào)的方法和全局的ontouch一樣的碌奉,有一點(diǎn)不一樣的是短曾,可以從view參數(shù)中判斷是否是當(dāng)前的控件的事件,和onCilck用法類(lèi)是道批。如圖。
總結(jié)入撒,這就是針對(duì)當(dāng)前頁(yè)面的ontouchEvent()事件方法和針對(duì)控件的ontouch()事件方法隆豹。
如果一個(gè)控件同時(shí)實(shí)現(xiàn)了ontouch()和onClick()事件,那么這2個(gè)方法都會(huì)被同時(shí)調(diào)用茅逮,
但是順序是璃赡,先調(diào)用玩ontouch()后(最少2次),才會(huì)調(diào)用onClick()
2個(gè)方法的返回值献雅,true都是代表了消費(fèi)這個(gè)事件碉考,false都是代表沒(méi)有消費(fèi)此事件
二、Gesture手勢(shì)及手勢(shì)庫(kù)挺身;
OnTouch提供的事件還是相對(duì)較簡(jiǎn)單侯谁,如果需要處理一些復(fù)雜的手勢(shì),用這個(gè)接口就會(huì)很麻煩章钾,因?yàn)槲覀円鶕?jù)用戶(hù)觸摸的軌跡去判斷是什么手勢(shì)墙贱。Androidsdk給我們提供了GestureDetector(Gesture:手勢(shì)Detector:識(shí)別)類(lèi),通過(guò)這個(gè)類(lèi)我們可以識(shí)別很多的手勢(shì)贱傀。
GestureDetector類(lèi)對(duì)外提供了兩個(gè)接口:OnGestureListener惨撇,OnDoubleTapListener,還有一個(gè)內(nèi)部類(lèi)SimpleOnGestureListener府寒;SimpleOnGestureListener類(lèi)是GestureDetector提供給我們的一個(gè)更方便的響應(yīng)不同手勢(shì)的類(lèi)魁衙,它實(shí)現(xiàn)了上述兩個(gè)接口,該類(lèi)是static class株搔,也就是說(shuō)它實(shí)際上是一個(gè)外部類(lèi)剖淀,我們可以在外部繼承這個(gè)類(lèi),重寫(xiě)里面的手勢(shì)處理方法纤房。因此實(shí)現(xiàn)手勢(shì)識(shí)別有兩種方法祷蝌,一種實(shí)現(xiàn)OnGestureListener接口,另一種是使用SimpleOnGestureListener類(lèi)帆卓。
OnGestureListener有下面的幾個(gè)動(dòng)作:
按下(onDown): 剛剛手指接觸到觸摸屏的那一剎那巨朦,就是觸的那一下。
拋擲(onFling): 手指在觸摸屏上迅速移動(dòng)剑令,并松開(kāi)的動(dòng)作糊啡。
長(zhǎng)按(onLongPress): 手指按在持續(xù)一段時(shí)間,并且沒(méi)有松開(kāi)吁津。
滾動(dòng)(onScroll): 手指在觸摸屏上滑動(dòng)棚蓄。
按锥榉觥(onShowPress): 手指按在觸摸屏上,它的時(shí)間范圍在按下起效梭依,在長(zhǎng)按之前稍算。
抬起(onSingleTapUp):手指離開(kāi)觸摸屏的那一剎那。
(一)役拴、操作步驟:
1糊探、在Activity中實(shí)例化GestureDetector,一個(gè)GestureDetector實(shí)例代表一個(gè)手勢(shì)檢測(cè)器河闰;
2科平、構(gòu)建GestureDetector時(shí)需要一個(gè)參數(shù)GestureDetector.OnGestureListener。OnGestureListener是一個(gè)監(jiān)聽(tīng)器姜性,負(fù)責(zé)對(duì)用戶(hù)的手勢(shì)行為提供相應(yīng)瞪慧。
3、重寫(xiě)onToutchEvent()方法部念,返回detector.onToutchEvent(event).
有一部需要注意弃酌,要在ontouchEvent方法里面,用手勢(shì)對(duì)象去調(diào)用ontouchevent方法儡炼。不然無(wú)法使用手勢(shì)庫(kù)矢腻。
以上是針對(duì)整個(gè)屏幕的手勢(shì)。
如果是針對(duì)單個(gè)控件的手勢(shì)射赛,只需要在ontouch()方法里面去調(diào)用detector.onToutchEvent(event).就可以了多柑。如下圖。使用很簡(jiǎn)單楣责。
還有一點(diǎn)需要注意的是竣灌,因?yàn)槭窃趏ntouchevent()和ontouch()方法里面調(diào)用的ontouchevent(),所以如果這個(gè)控件也實(shí)現(xiàn)了點(diǎn)擊事件,也活優(yōu)先執(zhí)行完手勢(shì)事件秆麸,最后執(zhí)行點(diǎn)擊事件onClick();