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