觸摸屏中的手勢(shì)識(shí)別_第1頁(yè)
觸摸屏中的手勢(shì)識(shí)別_第2頁(yè)
觸摸屏中的手勢(shì)識(shí)別_第3頁(yè)
觸摸屏中的手勢(shì)識(shí)別_第4頁(yè)
觸摸屏中的手勢(shì)識(shí)別_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論