内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

Android觸屏事件和MotionEvent詳解-創(chuàng)新互聯(lián)

Android屏幕操作

創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括大同網(wǎng)站建設(shè)、大同網(wǎng)站制作、大同網(wǎng)頁(yè)制作以及大同網(wǎng)絡(luò)營(yíng)銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,大同網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到大同省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

屏幕是用戶和Android設(shè)備交互的主要媒介,屏幕分為觸屏和非觸屏。Android設(shè)備目前有四種類型:Android Phone,Android Tablet,Android Wear和Android TV。Android TV大都使用非觸屏,其他三類設(shè)備則大都使用觸屏。對(duì)非觸屏設(shè)備,用戶可以通過鍵盤鼠標(biāo)或遙控器在屏幕上操作。對(duì)觸屏設(shè)備,用戶主要通過手指或觸控筆等工具在屏幕上操作,當(dāng)然也可以通過外接的鍵盤,鼠標(biāo)和軌跡球等工具來操作。

Android屏幕交互事件

用戶在設(shè)備屏幕上的所有操作都會(huì)轉(zhuǎn)換為各類屏幕交互事件。Android屏幕交互事件主要有如下幾種類型。

  • key event 鍵盤、遙控器按鍵,鼠標(biāo)點(diǎn)擊會(huì)生成按鍵事件(key event)
  • hover event 鼠標(biāo)在屏幕上的停留、滑動(dòng)會(huì)產(chǎn)生hover event
  • scroll event 鼠標(biāo)滾輪的滾動(dòng)會(huì)生成scroll event
  • touch event 對(duì)觸屏設(shè)備,當(dāng)用戶用手指或觸控筆在設(shè)備屏幕上操作時(shí)會(huì)產(chǎn)生觸屏事件(touch event)。

為了方便理解和簡(jiǎn)化描述,后文在介紹時(shí)會(huì)統(tǒng)一用手指操作來代指所有的觸屏操作。例如“當(dāng)手指接觸屏幕時(shí)產(chǎn)生此事件”,并不表示只能用手指接觸屏幕才會(huì)產(chǎn)生此事件,而是需要理解為“當(dāng)手指,觸控筆等工具接觸屏幕時(shí)都會(huì)產(chǎn)生此事件”。

觸屏事件類型

按照動(dòng)作來分,可以將觸屏事件可以分為以下三類

  1. 手指按到屏幕上
  2. 手指在屏幕上移動(dòng)
  3. 手指離開屏幕

其中手指按到屏幕上和手指離開屏幕一定是成對(duì)出現(xiàn)的,在這中間會(huì)出現(xiàn)不定次數(shù)的手指在屏幕上移動(dòng)的事件。

觸屏事件序列

在Android系統(tǒng)中,從手指按到屏幕上開始,到手指離開屏幕,這個(gè)過程中產(chǎn)生的一系列觸屏事件構(gòu)成了一個(gè)事件序列(也可以稱為事件流)。對(duì)多點(diǎn)觸屏事件,則是從第一個(gè)手指按到屏幕上開始,到最后一個(gè)手指離開屏幕為止。

一個(gè)觸屏事件序列第一個(gè)事件一定是手指按到屏幕上,最后一個(gè)事件一定是手指離開屏幕。用戶在設(shè)備屏幕上的所有觸屏操作最終都會(huì)轉(zhuǎn)換為若干個(gè)這樣的事件序列。

理解觸屏事件序列的概念非常重要,Android中對(duì)觸屏事件的處理很多時(shí)候需要以事件序列為單位進(jìn)行考察。

Android觸屏事件在代碼中的表示

在Android系統(tǒng)中使用MotionEvent對(duì)象來表示一個(gè)觸屏事件,當(dāng)用戶用手指在屏幕上操作時(shí),會(huì)產(chǎn)生一系列的MotionEvent對(duì)象。但是需要注意的是,產(chǎn)生了一個(gè)MotionEvent對(duì)象并不表示這一定是一個(gè)觸屏操作,MotionEvent不僅可以用來表示touch event,還可以表示hover event,scroll event。也就是說,除了key event之外的其他屏幕交互事件都用MotionEvent來表示(key event用KeyEvent對(duì)象表示)。

在MotionEvent類中將產(chǎn)生此次事件的動(dòng)作稱為motion,將產(chǎn)生此動(dòng)作的主體(如手指,鼠標(biāo)等)稱為pointer。一個(gè)MotionEvent對(duì)象中可以包含一個(gè)或多個(gè)pointer,每個(gè)pointer都包含id,index,位置,大小,方向等屬性。在一個(gè)觸屏事件序列的多個(gè)事件中,同一個(gè)pointer擁有相同的id,但是index可以不同。

這里只討論MotionEvent中關(guān)于touch event的部分。在MotionEvent對(duì)象中主要包含了如下信息:

1.操作類型(action code)

MotionEvent提供了getActionMasked()方法來獲取此次操作的類型,它是一個(gè)int型數(shù)值。除了getActionMasked()外還有一個(gè)getAction()方法,它和getActionMasked()的區(qū)別會(huì)在后面介紹。

在MotionEvent類中定義了一系列的int常量來表示各種預(yù)定義的操作類型。列舉如下。

事件類型常量 含義說明
ACTION_DOWN 當(dāng)手指接觸屏幕時(shí)產(chǎn)生此事件,在多點(diǎn)觸摸時(shí),只有第一個(gè)手指接觸屏幕時(shí)才會(huì)產(chǎn)生此事件,中間其他手指接觸屏幕不會(huì)產(chǎn)生此事件。它表示一個(gè)觸屏事件序列的開始。
ACTION_UP 當(dāng)手指離開屏幕時(shí)產(chǎn)生此事件,在多點(diǎn)觸摸時(shí),只有最后一個(gè)手指(這個(gè)手指并不一定是產(chǎn)生ACTION_DOWN事件的那個(gè)手指)離開屏幕時(shí)才會(huì)產(chǎn)生此事件,中間其他手指離開屏幕不會(huì)產(chǎn)生此事件。它表示一個(gè)觸屏事件序列的結(jié)束。
ACTION_MOVE 當(dāng)手指在屏幕上滑動(dòng)時(shí)產(chǎn)生此事件, 在多點(diǎn)觸摸時(shí),每個(gè)手指的滑動(dòng)都會(huì)產(chǎn)生一個(gè)此事件
ACTION_POINTER_DOWN 只有在多點(diǎn)觸摸時(shí)才會(huì)產(chǎn)生此事件,在一個(gè)觸屏事件序列中,除第一個(gè)接觸屏幕的手指外,其他手指接觸屏幕時(shí)會(huì)產(chǎn)生此事件。
ACTION_POINTER_UP 同樣只有在多點(diǎn)觸摸時(shí)才會(huì)產(chǎn)生此事件,在一個(gè)觸屏事件序列中,除最后一個(gè)離開屏幕的手指外,其他手指離開屏幕時(shí)會(huì)產(chǎn)生此事件。
ACTION_CANCEL 這個(gè)事件比較特殊,它和上述事件都不一樣,上述事件都是由用戶在屏幕上操作所觸發(fā)的,但是這個(gè)事件是由系統(tǒng)自動(dòng)產(chǎn)生的。當(dāng)一個(gè)事件序列需要提前終止的時(shí)候由系統(tǒng)自動(dòng)產(chǎn)生此事件。正常來說,一個(gè)事件序列應(yīng)該以最后一個(gè)手指離開屏幕,也就是ACTION_UP作為結(jié)束,但是在某些情況下,事件序列需要被提前終止。這通常是因?yàn)樘幚磉@個(gè)事件序列的View對(duì)象的Parent對(duì)象在事件序列結(jié)束之前主動(dòng)攔截了后續(xù)的事件。此外,如果處理這個(gè)事件序列的View對(duì)象從窗口中被移除了,它也會(huì)收到ACTION_CANCEL事件。例如處理這個(gè)事件序列的View對(duì)象所在的Activty被finish(),所在的Dialog被dismiss(),或者被其Parent View Remove了。在這些情況下,雖然這時(shí)手指還停留在屏幕上,但View對(duì)象將無法再接收到后續(xù)的觸屏事件,這時(shí)它會(huì)收到ACTION_CANCEL事件,表示事件序列由于外在原因需要提前終止。

結(jié)合上面觸屏事件序列的描述可以知道,一個(gè)正常的觸屏事件序列一定是以ACTION_DOWN為開始,以ACTION_UP為結(jié)束,中間可以有0個(gè)或多個(gè)ACTION_MOVE, 如果是多點(diǎn)觸摸,中間還會(huì)有若干次的ACTION_POINTER_DOWN和ACTION_POINTER_UP。ACTION_POINTER_DOWN和ACTION_POINTER_UP一定是數(shù)量相對(duì)的。


一個(gè)提前終止的觸屏事件序列一定是以ACTION_DOWN為開始,以ACTION_CANCEL為結(jié)束,中間可以有0個(gè)或多個(gè)ACTION_MOVE, 如果是多點(diǎn)觸摸,中間還會(huì)有若干次的ACTION_POINTER_DOWN和ACTION_POINTER_UP。ACTION_POINTER_DOWN和ACTION_POINTER_UP的數(shù)量可能不同。


getAction()和getActionMasked()的區(qū)別:對(duì)ACTION_POINTER_DOWN和ACTION_POINTER_UP之外的事件,getAction()返回值和getActionMasked()是相同的。對(duì)ACTION_POINTER_DOWN和ACTION_POINTER_UP,getAction()返回值和getActionMasked()返回值稍有不同。getAction()返回值包含了操作類型和產(chǎn)生此事件的pointer對(duì)應(yīng)的pointer index兩個(gè)信息,其中低8位代表操作類型,高8位代表pointer index 。

2.pointer信息

  1. 通過getPointerCount()方法獲取此事件產(chǎn)生時(shí)pointer的個(gè)數(shù),它一定是大于等于1的。例如有兩個(gè)手指接觸在屏幕上,則getPointerCount()為2。
  2. 通過getPointerId(int pointerIndex)獲取pointerIndex對(duì)應(yīng)的pointer id。
  3. 通過findPointerIndex(int pointerId)獲取pointerId對(duì)應(yīng)的pointer index。
  4. 通過getX(int pointerIndex),getY(int pointerIndex)方法來獲取此事件產(chǎn)生時(shí)pointerIndex對(duì)應(yīng)的pointer在屏幕上的相對(duì)位置。
  5. 通過getRawX(),getRawY()方法來獲取此事件產(chǎn)生時(shí)pointerIndex對(duì)應(yīng)的pointer在屏幕上的絕對(duì)位置。不帶參數(shù)的重載方法表示獲取pointerIndex為0的pointer在屏幕上的位置。

除此之外,還有g(shù)etToolMajor(),getToolMinor(),getTouchMajor(),getTouchMinor(),getOrientation()等方法獲取pointer的區(qū)域大小,方向等信息。由于實(shí)際使用的較少,這里就不做介紹了。

3.操作時(shí)間


可以通過MotionEvent類的getEventTime()方法來獲取此事件產(chǎn)生的時(shí)間。

4.事件序列的歷史數(shù)據(jù)


在MotionEvent對(duì)象中還會(huì)保存其所在的事件序列的一些歷史事件的信息,可以通過getHistorySize()獲取歷史事件記錄的條數(shù),通過一系列的getHistoricalXXX()方法獲取歷史事件的信息。由于ACTION_DOWN 是一個(gè)事件序列的開始,所以ACTION_DOWN對(duì)應(yīng)的事件對(duì)象中是不會(huì)有歷史事件記錄的,在這之后的事件對(duì)應(yīng)的MotionEvent對(duì)象中會(huì)有0到多個(gè)的歷史事件信息的記錄,具體記錄的個(gè)數(shù)并不固定,總的數(shù)量也不會(huì)太多。

在上述信息中,使用比較多的是前兩條,也就是事件的類型和事件產(chǎn)生時(shí)pointer的相關(guān)信息。

如有疑問請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

本文標(biāo)題:Android觸屏事件和MotionEvent詳解-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://www.rwnh.cn/article28/ceiojp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、App設(shè)計(jì)、網(wǎng)站改版、定制開發(fā)微信公眾號(hào)、小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
泸溪县| 文安县| 贵南县| 北川| 和田县| 资中县| 琼中| 朝阳区| 遵化市| 墨江| 格尔木市| 东兰县| 广安市| 秦皇岛市| 彰化县| 西城区| 肥城市| 浦城县| 华阴市| 南通市| 建始县| 甘泉县| 雅江县| 绍兴县| 南召县| 桂平市| 桂平市| 嘉峪关市| 永修县| 名山县| 四会市| 阿拉善左旗| 沙田区| 哈巴河县| 搜索| 华安县| 拜城县| 驻马店市| 德昌县| 泗水县| 霍州市|