![觸摸屏中的手勢(shì)識(shí)別_第1頁(yè)](http://file4.renrendoc.com/view/24d391b0158c63d7ec71d0d1d6e4d768/24d391b0158c63d7ec71d0d1d6e4d7681.gif)
![觸摸屏中的手勢(shì)識(shí)別_第2頁(yè)](http://file4.renrendoc.com/view/24d391b0158c63d7ec71d0d1d6e4d768/24d391b0158c63d7ec71d0d1d6e4d7682.gif)
![觸摸屏中的手勢(shì)識(shí)別_第3頁(yè)](http://file4.renrendoc.com/view/24d391b0158c63d7ec71d0d1d6e4d768/24d391b0158c63d7ec71d0d1d6e4d7683.gif)
![觸摸屏中的手勢(shì)識(shí)別_第4頁(yè)](http://file4.renrendoc.com/view/24d391b0158c63d7ec71d0d1d6e4d768/24d391b0158c63d7ec71d0d1d6e4d7684.gif)
![觸摸屏中的手勢(shì)識(shí)別_第5頁(yè)](http://file4.renrendoc.com/view/24d391b0158c63d7ec71d0d1d6e4d768/24d391b0158c63d7ec71d0d1d6e4d7685.gif)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、我們經(jīng)常利用觸摸屏的Fling、Scroll等Gesture (手勢(shì))操作來(lái)操作會(huì)使得應(yīng)用程序 的用戶(hù)體驗(yàn)大大提升,比如用Scroll手勢(shì)在瀏覽器中滾屏,用Fling在閱讀器中翻頁(yè)等。 在Android系統(tǒng)中,手勢(shì)的識(shí)別是通過(guò)GestureDetector.OnGestureListener接口來(lái)實(shí)現(xiàn) 的,不過(guò)翻遍了 Android的官方文檔也沒(méi)有找到一個(gè)相關(guān)的例子,API Demo中的TouchPaint 也僅僅是提到了 onTouch事件的處理,沒(méi)有涉及到手勢(shì)。Android Developer討論組里也有 不少人有和我類(lèi)似的問(wèn)題,結(jié)合他們提到的方法和我所做的實(shí)驗(yàn),我將給大家簡(jiǎn)單講述一下
2、Android中手勢(shì)識(shí)別的實(shí)現(xiàn)。我們先來(lái)明確一些概念,首先,Android的事件處理機(jī)制是基于Listener(監(jiān)聽(tīng)器)來(lái) 實(shí)現(xiàn)的,比如我們今天所說(shuō)的觸摸屏相關(guān)的事件,就是通過(guò)onTouchListener。其次,所有 View的子類(lèi)都可以通過(guò)setOnTouchListener()、setOnKeyListener()等方法來(lái)添加對(duì)某一 類(lèi)事件的監(jiān)聽(tīng)器。第三,Listener 一般會(huì)以Interface(接口)的方式來(lái)提供,其中包含一 個(gè)或多個(gè)abstract(抽象)方法,我們需要實(shí)現(xiàn)這些方法來(lái)完成onTouch()、onKey ()等等 的操作。這樣,當(dāng)我們給某個(gè)view設(shè)置了事件List
3、ener,并實(shí)現(xiàn)了其中的抽象方法以后, 程序便可以在特定的事件被dispatch到該view的時(shí)候,通過(guò)callback函數(shù)給予適當(dāng)?shù)捻?應(yīng)。看一個(gè)簡(jiǎn)單的例子,就用最簡(jiǎn)單的TextView來(lái)說(shuō)明(事實(shí)上和ADT中生成的skeleton 沒(méi)有什么區(qū)別)。Java代碼public class GestureTest extends Activity implements OnTouchListenerOverrideprotected void onCreate(Bundle savedInstanceState)super.onCreate(savedlnstanceState);setCont
4、entView(R.layout.main);/ init TextViewTextView tv = (TextView) findViewByld(R.id.page);/ set OnTouchListener on TextViewtv.setOnTouchListener(this);/ show some texttv.setText(R.string.text);Overridepublic boolean onTouch(View v, MotionEvent event) Toast.makeText(this, onTouch, Toast.LENGTH_SHORT).sh
5、ow();return false;我們給TextView的實(shí)例tv設(shè)定了一個(gè)onTouchListener,因?yàn)镚estureTest類(lèi)實(shí)現(xiàn) 了 OnTouchListener接口,所以簡(jiǎn)單的給一個(gè)this作為參數(shù)即可。onTouch方法則是實(shí)現(xiàn) 了 OnTouchListener中的抽象方法,我們只要在這里添加邏輯代碼即可在用戶(hù)觸摸屏幕時(shí)做 出響應(yīng),就像我們這里所做的一打出一個(gè)提示信息。這里,我們可以通過(guò)MotionEvent的getAction()方法來(lái)獲取Touch事件的類(lèi)型,包 括 ACTION_DOWN, ACTION_MOVE, ACTION_UP,和 ACTION_CANCEL
6、。ACTION_DOWN 是指按下觸 摸屏,ACTION_MOVE是指按下觸摸屏后移動(dòng)受力點(diǎn),ACTION_UP則是指松開(kāi)觸摸屏, ACTION_CANCEL不會(huì)由用戶(hù)直接觸發(fā)(所以不在今天的討論范圍,請(qǐng)參考 ViewGroup.onInterceptTouchEvent(MotionEvent)。借助對(duì)于用戶(hù)不同操作的判斷,結(jié)合 getRawX()、getRawY()、getX ()和getY ()等方法來(lái)獲取坐標(biāo)后,我們可以實(shí)現(xiàn)諸如拖動(dòng)某 一個(gè)按鈕,拖動(dòng)滾動(dòng)條等功能。待機(jī)可以看看MotionEvent類(lèi)的文檔,另外也可以看看 TouchPaint 例子?;氐浇裉焖f(shuō)的重點(diǎn),當(dāng)我們捕捉到T
7、ouch操作的時(shí)候,如何識(shí)別出用戶(hù)的Gesture? 這里我們需要 GestureDetector.OnGestureListener接口的幫助,于是我們的 GestureTest 類(lèi)就變成了這個(gè)樣子。Java代碼public class GestureTest extends Activity implements OnTouchListener, OnGestureListener 隨后,在onTouch()方法中,我們調(diào)用GestureDetector的onTouchEvent()方法,將捕 捉到的MotionEvent交給GestureDetector來(lái)分析是否有合適的callback
8、函數(shù)來(lái)處理用戶(hù) 的手勢(shì)。Java代碼Overridepublic boolean onTouch(View v, MotionEvent event) / OnGestureListener will analyzes the given motion eventreturn mGestureDetector.onTouchEvent(event);接下來(lái),我們實(shí)現(xiàn)了以下6個(gè)抽象方法,其中最有用的當(dāng)然是onFling()、onScroll() 和onLongPress() 了。我已經(jīng)把每一個(gè)方法代表的手勢(shì)的意思寫(xiě)在了注釋里,大家看一下就 明白了。/用戶(hù)輕觸觸摸屏,由1個(gè)MotionEvent
9、ACTION_DOWN觸發(fā)Java代碼Overridepublic boolean onDown(MotionEvent e) / TODO Auto-generated method stubToast.makeText(this, onDown, Toast.LENGTH_SHORT).show();return false;/用戶(hù)輕觸觸摸屏,尚未松開(kāi)或拖動(dòng),由一個(gè)1個(gè)MotionEvent ACTION_DOWN觸發(fā)/注意和onDown()的區(qū)別,強(qiáng)調(diào)的是沒(méi)有松開(kāi)或者拖動(dòng)的狀態(tài)Overridepublic void onShowPress(MotionEvent e) / TODO Au
10、to-generated method stub/用戶(hù)(輕觸觸摸屏后)松開(kāi),由一個(gè)1個(gè)MotionEvent ACTION_UP觸發(fā)Java代碼Overridepublic boolean onSingleTapUp(MotionEvent e) / TODO Auto-generated method stubreturn false;/用戶(hù)按下觸摸屏、快速移動(dòng)后松開(kāi),由1個(gè)MotionEvent ACTION_DOWN,多個(gè)ACTION_MOVE,1 個(gè) ACTION_UP 觸發(fā)Java代碼Overridepublic boolean onFling(MotionEvent el, Mot
11、ionEvent e2, float velocityX,float velocityY) / TODO Auto-generated method stubreturn false;/用戶(hù)長(zhǎng)按觸摸屏,由多個(gè)MotionEvent ACTION_DOWN觸發(fā)Overridepublic void onLongPress(MotionEvent e) / TODO Auto-generated method stub/用戶(hù)按下觸摸屏,并拖動(dòng),由1個(gè)MotionEvent ACTION_DOWN,多個(gè)ACTION_MOVE 觸發(fā)Overridepublic boolean onScroll(Mot
12、ionEvent el, MotionEvent e2, float distanceX,float distanceY) / TODO Auto-generated method stubreturn false;我們來(lái)試著做一個(gè)onFling()事件的處理吧,onFling ()方法中每一個(gè)參數(shù)的意義我寫(xiě) 在注釋中了,需要注意的是Fling事件的處理代碼中,除了第一個(gè)觸發(fā)Fling的ACTION_DOWN 和最后一個(gè)ACTION_MOVE中包含的坐標(biāo)等信息外,我們還可以根據(jù)用戶(hù)在X軸或者Y軸上的 移動(dòng)速度作為條件。比如下面的代碼中我們就在用戶(hù)移動(dòng)超過(guò)100個(gè)像素,且X軸上每秒的 移動(dòng)速度大
13、于200像素時(shí)才進(jìn)行處理。Java代碼Overridepublic boolean onFling(MotionEvent el, MotionEvent e2, float velocityX,float velocityY) /參數(shù)解釋?zhuān)? el:第 1 個(gè) ACTION_DOWN MotionEvent/ e2:最后一個(gè) ACTION_MOVE MotionEvent/ velocityX: X軸上的移動(dòng)速度,像素/秒/ velocityY: Y軸上的移動(dòng)速度,像素/秒/觸發(fā)條件:/ X軸的坐標(biāo)位移大于FLING_MIN_DISTANCE,且移動(dòng)速度大于FLING_MIN_VELOCIT
14、Y 個(gè)像素/秒if (e1.getX() - e2.getX() FLING_MIN_DISTANCE& Math.abs(velocityX) FLING_MIN_VELOCITY) / Fling leftToast.makeText(this, Fling Left, Toast.LENGTH_SHORT).show(); else if (e2.getX() - e1.getX() FLING_MIN_DISTANCE& Math.abs(velocityX) FLING_MIN_VELOCITY) / Fling rightToast.makeText(this, Fling Rig
15、ht, Toast.LENGTH_SHORT).show();return false;問(wèn)題是,這個(gè)時(shí)候如果我們嘗試去運(yùn)行程序,你會(huì)發(fā)現(xiàn)我們根本得不到想要的結(jié)果, 跟蹤代碼的執(zhí)行的會(huì)發(fā)現(xiàn)onFling()事件一直就沒(méi)有被捕捉到。這正是一開(kāi)始困擾我的問(wèn) 題,這到底是為什么呢?我在討論組的Gesture detection這個(gè)帖子里找到了答案,即我們需要在onCreate中 tv.setOnTouchListener(this);之后添加如下一句代碼。tv.setLongClickable(true);只有這樣,view才能夠處理不同于Tap (輕觸)的hold (即 ACTION_MOVE,或者多個(gè)ACTI
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 45154-2024老齡化社會(huì)年齡包容性勞動(dòng)力通用要求與指南
- GB/T 18487.5-2024電動(dòng)汽車(chē)傳導(dǎo)充電系統(tǒng)第5部分:用于GB/T 20234.3的直流充電系統(tǒng)
- racemic-9-Nor-9β-hydroxy-Hexahydrocannabinol-生命科學(xué)試劑-MCE-7978
- Glyceryl-dilaurate-生命科學(xué)試劑-MCE-3370
- 二零二五年度美發(fā)店租賃合同包含美發(fā)店品牌形象維護(hù)條款
- 2025年度智能化舞臺(tái)搭建安全責(zé)任及技術(shù)服務(wù)合同
- 2025年度銀行貸款反擔(dān)保合同違約責(zé)任合同
- 2025年度父母出資購(gòu)房子女房產(chǎn)增值收益分配協(xié)議書(shū)
- 施工日志填寫(xiě)樣本屋面防水工程
- 職場(chǎng)技能提升與自主創(chuàng)業(yè)的實(shí)踐案例分析
- 急性缺血性卒中再灌注治療指南2024解讀
- 暑假假期安全教育(課件)-小學(xué)生主題班會(huì)
- 2025年中考英語(yǔ)總復(fù)習(xí):閱讀理解練習(xí)題30篇(含答案解析)
- 陜西省英語(yǔ)中考試卷與參考答案(2024年)
- 中建醫(yī)院幕墻工程專(zhuān)項(xiàng)方案
- 基于OBE理念的世界現(xiàn)代史教學(xué)與學(xué)生歷史思維培養(yǎng)探究
- 施工現(xiàn)場(chǎng)揚(yáng)塵污染治理巡查記錄
- 2024年列車(chē)員技能競(jìng)賽理論考試題庫(kù)500題(含答案)
- 中南大學(xué)《藥理學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 《無(wú)人機(jī)測(cè)繪技術(shù)》項(xiàng)目3任務(wù)2無(wú)人機(jī)正射影像數(shù)據(jù)處理
- 《ISO 55013-2024 資產(chǎn)管理-數(shù)據(jù)資產(chǎn)管理指南》專(zhuān)業(yè)解讀和應(yīng)用指導(dǎo)材料(雷澤佳編制-2024B0)-121-240
評(píng)論
0/150
提交評(píng)論