Android界面框架支持對(duì)觸摸事件的監(jiān)聽(tīng),并能夠?qū)⒂|摸事件的詳細(xì)信息傳遞給處理函數(shù) 需要設(shè)置觸摸事件的監(jiān)聽(tīng)器,,并重載onTouch ()函數(shù) 第1行代碼是設(shè)置控件的觸摸事件監(jiān)聽(tīng)器 在代碼第3行的onTouch()函數(shù)中,,第1個(gè)參數(shù)View表示產(chǎn)生觸摸事件的界面控件;第2個(gè)參數(shù)MontionEvent表示觸摸事件的詳細(xì)信息,,如產(chǎn)生時(shí)間,、坐標(biāo)和觸點(diǎn)壓力等 第5行是onTouch()函數(shù)的返回值 TouchEventDemo是一個(gè)說(shuō)明如何處理觸摸事件的示例 TouchEventDemo用戶界面 淺藍(lán)色區(qū)域是可以接受觸摸事件的區(qū)域,用戶可以在Android模擬器中使用鼠標(biāo)點(diǎn)擊屏幕,,用以模擬觸摸手機(jī)屏幕 下方黑色區(qū)域是顯示區(qū)域,,用來(lái)顯示觸摸事件的類型、相對(duì)坐標(biāo),、絕對(duì)坐標(biāo),、觸點(diǎn)壓力,、觸點(diǎn)尺寸和歷史數(shù)據(jù)量等信息 在用戶界面中使用了線性布局,并加入了3個(gè)TextView控件 第1個(gè)TextView(ID為touch_area)用來(lái)標(biāo)識(shí)觸摸事件的測(cè)試區(qū)域 第2個(gè)TextView(ID為history_label)用來(lái)顯示觸摸事件的歷史數(shù)據(jù)量 第3個(gè)TextView(ID為event_label)用來(lái)觸摸事件的詳細(xì)信息,,包括類型,、相對(duì)坐標(biāo)、絕對(duì)坐標(biāo),、觸點(diǎn)壓力和觸點(diǎn)尺寸 XML文件的代碼如下 第9行代碼定義了TextView的背景顏色,,#80A0FF是顏色代碼 第10行代碼定義了TextView的字體顏色 在代碼中為了能夠引用XML文件中聲明的界面元素,使用了下面的代碼 當(dāng)手指接觸到觸摸屏,、在觸摸屏上移動(dòng)或離開(kāi)觸摸屏?xí)r,,分別會(huì)引發(fā)ACTION_DOWN、ACTION_UP和ACTION_MOVE觸摸事件,,而無(wú)論是哪種觸摸事件,,都會(huì)調(diào)用onTouch()函數(shù)進(jìn)行處理 事件類型包含在onTouch()函數(shù)的MotionEvent參數(shù)中,可以通過(guò)getAction()函數(shù)獲取到觸摸事件的類型,,然后根據(jù)觸摸事件的不同類型進(jìn)行不同的處理 為了能夠使屏幕最上方的TextView處理觸摸事件,,需要使用setOnTouchListener()函數(shù)在代碼中設(shè)置觸摸事件監(jiān)聽(tīng)器,并在onTouch()函數(shù)添加觸摸事件的處理過(guò)程 第7行代碼的Display()是一個(gè)自定義函數(shù),,主要用來(lái)顯示觸摸事件的詳細(xì)信息,,函數(shù)的代碼和含義將在后面進(jìn)行介紹 第10行代碼的ProcessHistory()也是一個(gè)自定義函數(shù),用來(lái)處理觸摸事件的歷史數(shù)據(jù),,后面進(jìn)行介紹 第11行代碼是使用TextView顯示歷史數(shù)據(jù)的數(shù)量 MotionEvent參數(shù)中不僅有觸摸事件的類型信息,,還觸點(diǎn)的坐標(biāo)信息,獲取方法是使用getX()和getY()函數(shù),,這兩個(gè)函數(shù)獲取到的是觸點(diǎn)相對(duì)于父界面元素的坐標(biāo)信息,。如果需要獲取絕對(duì)坐標(biāo)信息,則可使用getRawX()和getRawY()函數(shù) 觸點(diǎn)壓力是一個(gè)介于0和1之間的浮點(diǎn)數(shù),,用來(lái)表示用戶對(duì)觸摸屏施加壓力的大小,,接近0表示壓力較小,接近1表示壓力較大,,獲取觸摸事件觸點(diǎn)壓力的方式是調(diào)用getPressure()函數(shù) 觸點(diǎn)尺寸指用戶接觸觸摸屏的接觸點(diǎn)大小,,也是一個(gè)介于0和1之間的浮點(diǎn)數(shù),接近0表示尺寸較小,,接近1表示尺寸較大,,可以使用getSize()函數(shù)獲取 Display()將MotionEvent參數(shù)參數(shù)中的事件信息提取出來(lái),并顯示在用戶界面上 一般情況下,,如果用戶將手指放在觸摸屏上,,但不移動(dòng),然后抬起手指,應(yīng)先后產(chǎn)生ACTION_DOWN和ACTION_UP兩個(gè)觸摸事件 但如果用戶在屏幕上移動(dòng)手指,,然后再抬起手指,,則會(huì)產(chǎn)生這樣的事件序列:ACTION_DOWN → ACTION_MOVE → ACTION_MOVE → ACTION_MOVE → ……→ ACTION_UP 在手機(jī)上運(yùn)行的應(yīng)用程序,效率是非常重要的,。如果Android界面框架不能產(chǎn)生足夠多的觸摸事件,,則應(yīng)用程序就不能夠很精確的描繪觸摸屏上的觸摸軌跡 如果Android界面框架產(chǎn)生了過(guò)多的觸摸事件,雖然能夠滿足精度的要求,,但卻降低了應(yīng)用程序效率 Android界面框架使用了“打包”的解決方法,。在觸點(diǎn)移動(dòng)速度較快時(shí)會(huì)產(chǎn)生大量的數(shù)據(jù),每經(jīng)過(guò)一定的時(shí)間間隔便會(huì)產(chǎn)生一個(gè)ACTION_MOVE事件,,在這個(gè)事件中,,除了有當(dāng)前觸點(diǎn)的相關(guān)信息外,,還包含這段時(shí)間間隔內(nèi)觸點(diǎn)軌跡的歷史數(shù)據(jù)信息,,這樣既能夠保持精度,又不至于產(chǎn)生過(guò)多的觸摸事件,。 通常情況下,,在ACTION_MOVE的事件處理函數(shù)中,都先處理歷史數(shù)據(jù),,然后再處理當(dāng)前數(shù)據(jù) 第3行代碼獲取了歷史數(shù)據(jù)的數(shù)量 然后在第4行至12行中循環(huán)處理這些歷史數(shù)據(jù) 第5行代碼獲取了歷史事件的發(fā)生時(shí)間 第6行代碼獲取歷史事件的觸點(diǎn)壓力 第7行和第8行代碼獲取歷史事件的相對(duì)坐標(biāo) 第9行獲取歷史事件的觸點(diǎn)尺寸 在第14行返回歷史數(shù)據(jù)的數(shù)量,,主要是用于界面顯示 Android模擬器并不支持觸點(diǎn)壓力和觸點(diǎn)尺寸的模擬,所有觸點(diǎn)壓力恒為1.0,,觸點(diǎn)尺寸恒為0.0 同時(shí)Android模擬器上也無(wú)法產(chǎn)生歷史數(shù)據(jù),,因此歷史數(shù)據(jù)量一直顯示為0 |
|