Android游戲開發(fā)之單點觸摸與多點觸摸的響應(yīng)方式
雨松MOMO原創(chuàng)文章如轉(zhuǎn)載,請注明:轉(zhuǎn)載自
雨松MOMO的博客
原文地址:
http://blog.csdn.net/xys289187120/article/details/6686708

游戲開發(fā)中的觸摸事件
在游戲開發(fā)中監(jiān)聽屏幕觸摸事件須要在View中重寫父類onTouchEvent方法,在重寫的方法中攔截用戶觸摸屏幕的一些信息,比如觸摸屏幕的X 、 Y坐標(biāo) 觸摸屏幕發(fā)生的事件 觸摸按下 觸摸抬起 觸摸移動,觸摸屏幕發(fā)生的時間 等等, 我們先看看onTouchEvent的函數(shù)原型。
函數(shù)中的Event 參數(shù)的意思為當(dāng)前觸摸事件的對象,這個對象中包含著當(dāng)前觸摸事件的一切信息。比如ecent.getAction()可以拿到當(dāng)前觸摸事件的名稱,根據(jù)觸摸事件的名稱可以判斷當(dāng)前是觸摸按下 還是 觸摸移動 還是 觸摸抬起。 event.getX()與 event.getY()可以拿到當(dāng)前觸摸屏幕的X Y坐標(biāo)。event.getEventTime(); 可以拿到當(dāng)前觸發(fā)觸摸事件的時間,等等所有的信息。
這個函數(shù)是具有有返回值的,須要返回一個布爾值。大家發(fā)現(xiàn)我將return super.onTouchEvent(event)注釋掉了而是直接return ture。 我給同學(xué)們解釋一下為什么要著么操作。onTouchEvent方法不是我們手動調(diào)用的而是系統(tǒng)調(diào)用的 它的返回值會直接通知系統(tǒng)是否回調(diào)方法。如果說在這里return false onTouchEvent方法永遠(yuǎn)不會在被回調(diào)也就是說它只能響應(yīng)觸摸按下操作,觸摸移動事件 和觸摸抬起事件永遠(yuǎn)都不會在被響應(yīng) ,log只會打印出"ACTION_DOWN"。 如果這里return super.onTouchEvent(event); 調(diào)用父類的方法來得到返回值返回 ,這樣也是有問題的因為調(diào)用父類的onTouchEvent方法可能也會返回false 這樣一來依然會無法響應(yīng)觸摸移動事件和觸摸抬起事件。所以為了正確的處理觸摸事件在這里我們直接return ture 這樣一來就萬無一失了, Log中會將所有信息都打印出來。
1.單點觸摸
在下面這個DEMO中 用手觸摸 移動 屏幕后 下面的icon圖片會跟隨這我的手勢移動。 代碼實現(xiàn)主要是在onTouchEvent方法中時時去計算手觸摸屏幕各個狀態(tài)的坐標(biāo) 然后調(diào)用postInvalidate(); 方法去通知UI刷新屏幕重新顯示圖片 文字的位置以及內(nèi)容。 具體相關(guān)內(nèi)容見 Android游戲開發(fā)之構(gòu)建游戲框架View與SurFaceView的區(qū)別(五)
2.多點觸摸
由于模擬器只能用鼠標(biāo)點擊一個點 無法模擬多點觸摸,所以我用真機(jī)來調(diào)試多點觸摸。下面這張圖是我用豌豆莢在真機(jī)中截的圖,此時我兩只手指正在手機(jī)屏幕中觸摸移動。界面中正確的根據(jù)我的手勢來移動圖片以及顯示的內(nèi)容。這里強(qiáng)調(diào)一下多點觸摸并不是所有手機(jī)都支持 有些手機(jī)支持很多點有些手機(jī)可能只支持單點。就那我的手機(jī)來說只支持兩點觸摸。所以無論我用多少根手指頭在我的手機(jī)屏幕上比劃 也只會出現(xiàn)2個觸摸點,如下圖所示。
下面我們詳細(xì)的說一下代碼的實現(xiàn)方式,多點觸摸和單點觸摸一樣都是在onTouchEvent中去監(jiān)聽觸摸事件。調(diào)用方法event.getPointerCount(); 可以拿到當(dāng)前屏幕同時觸摸點的數(shù)量 以我的手機(jī)為例因為只支持兩點觸摸所以在我的手機(jī)上調(diào)用該方法最多只會返回2。 拿到了觸摸屏幕點的數(shù)量以后 可以使用for循環(huán)來遍歷當(dāng)前屏幕的所有觸摸點,調(diào)用event.getX(i); 與 event.getY(i); 方法 將ID作為參數(shù)傳入會得到每個點在屏幕中顯示的X Y坐標(biāo)值。最后根據(jù)坐標(biāo)值將圖片與內(nèi)容繪制在手機(jī)屏幕中。
總體來說這章內(nèi)容還是比較簡單的, 老規(guī)矩每篇文章都會附帶源代碼,最后如果你還是覺得我寫的不夠詳細(xì) 看的不夠爽 不要緊我把源代碼的下載地址貼出來 歡迎大家一起討論學(xué)習(xí)雨松MOMO希望可以和大家一起進(jìn)步。
下載地址: http://download.csdn.net/source/3519249
函數(shù)中的Event 參數(shù)的意思為當(dāng)前觸摸事件的對象,這個對象中包含著當(dāng)前觸摸事件的一切信息。比如ecent.getAction()可以拿到當(dāng)前觸摸事件的名稱,根據(jù)觸摸事件的名稱可以判斷當(dāng)前是觸摸按下 還是 觸摸移動 還是 觸摸抬起。 event.getX()與 event.getY()可以拿到當(dāng)前觸摸屏幕的X Y坐標(biāo)。event.getEventTime(); 可以拿到當(dāng)前觸發(fā)觸摸事件的時間,等等所有的信息。
這個函數(shù)是具有有返回值的,須要返回一個布爾值。大家發(fā)現(xiàn)我將return super.onTouchEvent(event)注釋掉了而是直接return ture。 我給同學(xué)們解釋一下為什么要著么操作。onTouchEvent方法不是我們手動調(diào)用的而是系統(tǒng)調(diào)用的 它的返回值會直接通知系統(tǒng)是否回調(diào)方法。如果說在這里return false onTouchEvent方法永遠(yuǎn)不會在被回調(diào)也就是說它只能響應(yīng)觸摸按下操作,觸摸移動事件 和觸摸抬起事件永遠(yuǎn)都不會在被響應(yīng) ,log只會打印出"ACTION_DOWN"。 如果這里return super.onTouchEvent(event); 調(diào)用父類的方法來得到返回值返回 ,這樣也是有問題的因為調(diào)用父類的onTouchEvent方法可能也會返回false 這樣一來依然會無法響應(yīng)觸摸移動事件和觸摸抬起事件。所以為了正確的處理觸摸事件在這里我們直接return ture 這樣一來就萬無一失了, Log中會將所有信息都打印出來。
1.單點觸摸
在下面這個DEMO中 用手觸摸 移動 屏幕后 下面的icon圖片會跟隨這我的手勢移動。 代碼實現(xiàn)主要是在onTouchEvent方法中時時去計算手觸摸屏幕各個狀態(tài)的坐標(biāo) 然后調(diào)用postInvalidate(); 方法去通知UI刷新屏幕重新顯示圖片 文字的位置以及內(nèi)容。 具體相關(guān)內(nèi)容見 Android游戲開發(fā)之構(gòu)建游戲框架View與SurFaceView的區(qū)別(五)
2.多點觸摸
由于模擬器只能用鼠標(biāo)點擊一個點 無法模擬多點觸摸,所以我用真機(jī)來調(diào)試多點觸摸。下面這張圖是我用豌豆莢在真機(jī)中截的圖,此時我兩只手指正在手機(jī)屏幕中觸摸移動。界面中正確的根據(jù)我的手勢來移動圖片以及顯示的內(nèi)容。這里強(qiáng)調(diào)一下多點觸摸并不是所有手機(jī)都支持 有些手機(jī)支持很多點有些手機(jī)可能只支持單點。就那我的手機(jī)來說只支持兩點觸摸。所以無論我用多少根手指頭在我的手機(jī)屏幕上比劃 也只會出現(xiàn)2個觸摸點,如下圖所示。
下面我們詳細(xì)的說一下代碼的實現(xiàn)方式,多點觸摸和單點觸摸一樣都是在onTouchEvent中去監(jiān)聽觸摸事件。調(diào)用方法event.getPointerCount(); 可以拿到當(dāng)前屏幕同時觸摸點的數(shù)量 以我的手機(jī)為例因為只支持兩點觸摸所以在我的手機(jī)上調(diào)用該方法最多只會返回2。 拿到了觸摸屏幕點的數(shù)量以后 可以使用for循環(huán)來遍歷當(dāng)前屏幕的所有觸摸點,調(diào)用event.getX(i); 與 event.getY(i); 方法 將ID作為參數(shù)傳入會得到每個點在屏幕中顯示的X Y坐標(biāo)值。最后根據(jù)坐標(biāo)值將圖片與內(nèi)容繪制在手機(jī)屏幕中。
總體來說這章內(nèi)容還是比較簡單的, 老規(guī)矩每篇文章都會附帶源代碼,最后如果你還是覺得我寫的不夠詳細(xì) 看的不夠爽 不要緊我把源代碼的下載地址貼出來 歡迎大家一起討論學(xué)習(xí)雨松MOMO希望可以和大家一起進(jìn)步。
下載地址: http://download.csdn.net/source/3519249
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
