处理触摸事件
和处理其他事件一样,可以对舞台上的元件监听触摸事件,然后编写事件处理函数。触摸事件有哪些类型?如何使用?它们和鼠标事件又有什么区别?学完本节大家便会得到答案。
使用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);
- }
- }
- }