疑难解答

Flash Player 10.1 和更高版本,Adobe AIR 2 和更高版本

支持触摸输入的硬件和软件的变化速度很快。此参考不能维护支持多点触控的操作系统和软件组合上的每个设备的列表。但是,它提供了有关如何使用发现 API 来确定是否可以在支持多点触控的设备上部署您的应用程序的指导,还提供了用于疑难解答 ActionScript 代码的技巧。

Flash 运行时基于传递给运行时的设备、操作系统或包含的软件(如浏览器)的信息来响应触摸事件。对软件环境的这种依赖关系使文档多点触控兼容变得很复杂。某些设备对手势或触摸动作的解释不同于其他设备。旋转是由两个手指同时旋转定义的吗?旋转是指使用一个手指在屏幕上绘制圆形吗?根据硬件和软件环境,旋转手势可能会完全不同。因此,当用户输入时,设备会告知操作系统,然后操作系统将该信息传递给运行时。如果运行时位于浏览器之内,则有时浏览器软件会解释手势或触摸事件,但不会将输入传递给运行时。此行为类似于“热键”行为:尝试使用特定的键组合使 Flash Player 在浏览器内部执行某些操作且浏览器始终打开一个菜单。

如果单独的 API 和类与特定的操作系统不兼容,会显示出来。您可以从以下位置了解各个 API 条目,首先了解 Multitouch 类: http://help.adobe.com/zh_CN/FlashPlatform/reference/actionscript/3/flash/ui/Multitouch.html

以下是一些常用的手势和触摸说明:
平移
从左到右或从右到左移动手指。某些设备要求两个手指平移。

旋转
按下两个手指,然后绕一个圆移动(就像它们同时在跟踪平面上一个虚构的圆一样)。将轴点设置为这两个手指触摸点之间的中点。

滑动
从左到右或从右到左、从上到下或从下到上快速移动三个手指。

缩放
按下两个手指,然后使其互相远离进行放大,互相靠近进行缩小。

按住并点击
移动或按下一个手指,然后使用另一个手指点击平面。

每个设备都有自己的文档,其中介绍有关该设备支持的手势以及如何在该设备上执行各个动作的信息。通常,在手势之间,用户必须移开与设备接触的所有手指,具体取决于操作系统。

如果您发现您的应用程序无法响应触摸事件或手势,请执行以下测试:
  1. 您是否将触摸或手势事件的事件侦听器附加到从 InteractiveObject 类继承的 Object 类?只有 InteractiveObject 实例可以侦听触摸和手势事件

  2. 是否正在 Flash Professional CS5 中测试您的应用程序?如果是,尝试发布和测试该应用程序,因为 Flash Professional 可截获交互。

  3. 首先启动简单的事件并查看哪些可以正常工作(以下代码示例来自 Multitouch.inputMode 的 API 条目:

    Multitouch.inputMode=MultitouchInputMode.TOUCH_POINT; 
    var mySprite:Sprite = new Sprite(); 
    var myTextField:TextField = new TextField() 
     
    mySprite.graphics.beginFill(0x336699); 
    mySprite.graphics.drawRect(0,0,40,40); 
    addChild(mySprite); 
     
    mySprite.addEventListener(TouchEvent.TOUCH_TAP, taplistener); 
     
    function taplistener(e:TouchEvent): void { 
        myTextField.text = "I've been tapped"; 
        myTextField.y = 50; 
        addChild(myTextField); 
    }

    点击此矩形。如果此示例可以正常运行,即可了解您的环境支持简单的轻敲。然后您可以尝试执行更复杂的处理。

    测试手势支持更复杂。单个设备或操作系统支持任何动作输入组合或不支持任何手势输入。

    以下是一个简单的缩放手势测试:

    Multitouch.inputMode = MultitouchInputMode.GESTURE; 
     
    stage.addEventListener(TransformGestureEvent.GESTURE_ZOOM , onZoom); 
    var myTextField = new TextField(); 
    myTextField.y = 200; 
    myTextField.text = "Perform a zoom gesture"; 
    addChild(myTextField); 
     
    function onZoom(evt:TransformGestureEvent):void { 
        myTextField.text = "Zoom is supported"; 
    }

    对设备执行缩放手势,并查看该文本字段是否填充了 Zoom is supported 消息。事件侦听器已添加到舞台中,因此您可以对测试应用程序的任何部分执行手势。

    以下是一个简单的全景手势测试:

    Multitouch.inputMode = MultitouchInputMode.GESTURE; 
     
    stage.addEventListener(TransformGestureEvent.GESTURE_PAN , onPan); 
    var myTextField = new TextField(); 
    myTextField.y = 200; 
    myTextField.text = "Perform a pan gesture"; 
    addChild(myTextField); 
     
    function onPan(evt:TransformGestureEvent):void { 
        myTextField.text = "Pan is supported"; 
    }

    对设备执行全景手势,并查看该文本字段是否填充了 Pan is supported 消息。事件侦听器已添加到舞台中,因此您可以对测试应用程序的任何部分执行手势。

    某些操作系统和设备组合同时支持这两种手势,某些只支持一种,某些这两种都不支持。测试您的应用程序的部署环境以了解情况。

已知问题

以下是与触摸屏输入相关的已知问题:
  1. Windows Mobile 操作系统上的 Mobile Internet Explorer 会自动缩放 SWF 文件内容:

    通过将下列代码添加到承载 SWF 文件的 HTML 页面来覆盖此 Internet Explorer 缩放行为:

    <head> 
    <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0"> 
    </head>
  2. 对于 Windows 7(也可能是其他操作系统),用户必须在手势之间将指针设备(或手指)从屏幕上移开。例如:旋转和缩放图像:
    • 执行旋转手势。

    • 将您的手指从屏幕上移开。

    • 将您的手指放回到屏幕上并执行缩放手势。

  3. 对于 Windows 7(可能是其他操作系统),如果用户非常快速地执行手势,则旋转和缩放手势并不始终生成“update”相位。

  4. Windows 7 Starter Edition 不支持多点触控。有关详细信息,请参阅 AIR Labs 论坛: http://forums.adobe.com/thread/579180?tstart=0

  5. 对于 Mac OS 10.5.3 及更高版本, Multitouch.supportsGestureEvents 值始终为 true ,即使硬件不支持手势事件也是如此。