AIR Android:使用TouchEvent類(lèi)(1)
處理觸摸事件
和處理其他事件一樣,可以對(duì)舞臺(tái)上的元件監(jiān)聽(tīng)觸摸事件,然后編寫(xiě)事件處理函數(shù)。觸摸事件有哪些類(lèi)型?如何使用?它們和鼠標(biāo)事件又有什么區(qū)別?學(xué)完本節(jié)大家便會(huì)得到答案。
使用TouchEvent類(lèi)(1)
所有的觸摸動(dòng)作都將產(chǎn)生TouchEvent類(lèi)型的事件對(duì)象。TouchEvent類(lèi)位于flash.events包中,所有的Touch事件類(lèi)型都被定義為它的靜態(tài)常量,如表3-1所示。
表3-1 TouchEvent類(lèi)型
![]() |
在TouchEvent類(lèi)中,除了父類(lèi)Event的屬性和方法外,還定義了幾個(gè)和觸摸動(dòng)作相關(guān)的實(shí)例屬性,說(shuō)明如下。
stageX和stageY:表示對(duì)應(yīng)的觸摸點(diǎn)在屏幕上的全局坐標(biāo)。
pressure:取值為0.0~1.0,表示觸摸點(diǎn)處的屏幕壓力。如果設(shè)備不支持這個(gè)功能,那么其值將總為1.0。
sizeX和sizeY:分別對(duì)應(yīng)觸摸點(diǎn)接觸區(qū)域的寬和高。
touchPointID:觸摸點(diǎn)的唯一標(biāo)識(shí),是整型數(shù)據(jù)。
在處理觸摸事件時(shí),touchPointID是經(jīng)常使用的一個(gè)參數(shù),用來(lái)標(biāo)識(shí)觸摸事件。觸摸操作可能有多個(gè)觸摸點(diǎn),比如兩個(gè)手指同時(shí)觸摸屏幕,TOUCH_BEGIN事件將發(fā)生兩次,產(chǎn)生的TouchEvent分別對(duì)應(yīng)不同位置的觸摸點(diǎn)。為了區(qū)分觸摸點(diǎn),AIR運(yùn)行時(shí)會(huì)為每個(gè)觸摸點(diǎn)分配一個(gè)唯一的標(biāo)識(shí),即touchPointID。
當(dāng)TOUCH_BEGIN事件第一次發(fā)生時(shí),AIR運(yùn)行時(shí)會(huì)從0開(kāi)始分配touchPointID給每個(gè)TouchEvent,直到數(shù)目超出了系統(tǒng)所能支持的最大觸摸點(diǎn)數(shù),超出范圍的觸摸事件將被忽略。Android設(shè)備一般只支持兩個(gè)觸摸點(diǎn),也就是說(shuō)TouchEvent對(duì)象的touchPointID的值只可能是0或1。每個(gè)觸摸動(dòng)作結(jié)束時(shí),對(duì)應(yīng)的touchPointID被回收,供新的觸摸點(diǎn)使用。
下面用一個(gè)TouchEventEx的例子演示TOUCH_BEGIN和TOUCH_END的用法。每當(dāng)一個(gè)或兩個(gè)手指觸摸屏幕時(shí),程序會(huì)在觸摸點(diǎn)附近畫(huà)一個(gè)圓,并開(kāi)始拖拽這個(gè)圓,直到TOUCH_END事件發(fā)生,拖拽結(jié)束。程序的主類(lèi)Main.as的代碼如下:
- package
- {
- import flash.display.Graphics;
- import flash.display.Sprite;
- import flash.events.TouchEvent;
- import flash.ui.Multitouch;
- import flash.ui.MultitouchInputMode;
- //AppBase是一個(gè)基礎(chǔ)類(lèi),定義了程序的基本屬性
- public class Main extends AppBase
- {
- override protected function init():void
- {
- //判斷是否支持TouchEvent
- if ( Multitouch.supportsTouchEvents )
- {
- //設(shè)置交互模式為處理觸摸動(dòng)作
- Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
- //監(jiān)聽(tīng)舞臺(tái)的TOUCH_BEGIN和TOUCH_END事件
- stage.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin);
- stage.addEventListener(TouchEvent.TOUCH_END, onTouchEnd);
- }
- }
- //創(chuàng)建可視對(duì)象,并畫(huà)圓
- private function createCircle():Sprite
- {
- var box:Sprite = new Sprite();
- var g:Graphics = box.graphics;
- g.beginFill(0x808888);
- g.drawCircle(0, 0, 30);
- g.endFill();
- return box;
- }
- //TOUCH_BEGIN事件處理函數(shù)
- private function onTouchBegin(e:TouchEvent):void
- {
- //在觸摸點(diǎn)處添加一個(gè)圓
- var box:Sprite = createCircle();
- addChild(box);
- //將元件移到觸摸點(diǎn)對(duì)應(yīng)的舞臺(tái)坐標(biāo)處
- box.x = e.stageX;
- box.y = e.stageY;
- //調(diào)用可視對(duì)象的startTouchDrag,開(kāi)始拖拽元件
- box.startTouchDrag(e.touchPointID);
- }
- //TOUCH_END事件處理函數(shù)
- private function onTouchEnd(e:TouchEvent):void
- {
- //調(diào)用stopTouchDrag結(jié)束拖拽
- e.target.stopTouchDrag(e.touchPointID);
- }
- }
- }