加速器输入

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

Accelerometer 类根据由设备的运动传感器检测的活动调度事件。此数据表示设备的位置或沿三维轴的移动。当设备移动时,传感器检测此移动并返回设备的加速坐标。Accelerometer 类提供了查询是否支持加速计以及设置调度加速事件的速率的方法。

加速计轴将标准化为显示方向,而不是设备的物理方向。当设备重定向显示方向时,加速计轴也将随之重定向。因此,当用户以正常的垂直查看位置握持手机时,无论手机向哪个方向旋转,y 轴始终保持大致的垂直。如果禁用了自动方向,例如,以全屏模式在浏览器中显示 SWF 内容,则当设备旋转时,加速计轴不会随之重定向。

检查加速计支持

使用 Accelerometer.isSupported 属性测试运行时环境是否能够使用此功能:

if (Accelerometer.isSupported) 
{ 
    // Set up Accelerometer event listeners and code. 
}

为每个 API 入口列出的运行时版本都可以访问 Accelerometer 类及其成员。但是,当前环境在运行时确定此功能的可用性。例如,您可以使用 Flash Player 10.1 的 Accelerometer 类属性编译代码,但需要使用 Accelerometer.isSupported 属性测试用户设备上 Accelerometer 功能的可用性。如果 Accelerometer.isSupported 在运行时为 true,则当前存在加速计支持。

检测加速计更改

要使用加速计传感器,请实例化 Accelerometer 对象并注册调度的 update 事件。update 事件是 Accelerometer 事件对象。此事件包含四个属性,每个都是数字:

  • accelerationX — 沿 X 轴的加速,以 g’s 为度量单位。当设备位于垂直位置时,X 轴的方向是从设备左侧到右侧。(设备位于垂直位置指设备顶部朝上。)如果设备向右移动,则加速度为正。

  • accelerationY — 沿 Y 轴的加速,以 g’s 为度量单位。当设备位于垂直位置时,Y 轴的方向是从设备底部到顶部。(设备位于垂直位置指设备顶部朝上。)如果设备相对于此轴上移,加速为正。

  • accelerationZ — 沿 Z 轴的加速,以 g’s 为度量单位。Z 轴取向与设备表面垂直。如果您移动设备使其面朝上,则加速度为正。如果设备面朝下,则加速度为负。

  • timestamp — 初始化运行时后,事件的毫秒数。

1 g 是标准的重力加速度,大约为 9.8 米/秒2.

以下是在文本字段中显示加速计数据的基本示例:

var accl:Accelerometer; 
if (Accelerometer.isSupported) 
{ 
    accl = new Accelerometer(); 
    accl.addEventListener(AccelerometerEvent.UPDATE, updateHandler); 
} 
else 
{ 
    accTextField.text = "Accelerometer feature not supported"; 
} 
function updateHandler(evt:AccelerometerEvent):void 
{ 
    accTextField.text = "acceleration X: " + evt.accelerationX.toString() + "\n" 
            + "acceleration Y: " + evt.accelerationY.toString() + "\n" 
            + "acceleration Z: " + evt.accelerationZ.toString() 
}

要使用此示例,请确保创建 accTextField 文本字段并在使用此代码之前将其添加到显示列表。

您可以通过调用 Accelerometer 对象的 setRequestedUpdateInterval() 方法为加速计事件调整所需的时间间隔。此方法采用一个参数 interval,是请求的更新时间间隔(以毫秒为单位):

var accl:Accelerometer; 
accl = new Accelerometer(); 
accl.setRequestedUpdateInterval(1000);

加速计更新之间的实际时间可能大于或小于此值。更新间隔的任何更改都会影响所有注册侦听器。如果您不调用 setRequestedUpdateInterval() 方法,应用程序将根据设备的默认时间间隔接收更新。

加速计数据具有某种程度的不准确性。您可以使用最近数据的移动平均数来尽量消除数据误差。例如,以下示例列出了带当前读数的最近加速计读数以获得舍入结果:

var accl:Accelerometer; 
var rollingX:Number = 0; 
var rollingY:Number = 0; 
var rollingZ:Number = 0; 
const FACTOR:Number = 0.25; 
 
if (Accelerometer.isSupported) 
{ 
    accl = new Accelerometer(); 
    accl.setRequestedUpdateInterval(200); 
    accl.addEventListener(AccelerometerEvent.UPDATE, updateHandler); 
} 
else 
{ 
    accTextField.text = "Accelerometer feature not supported"; 
} 
function updateHandler(event:AccelerometerEvent):void 
{ 
    accelRollingAvg(event); 
    accTextField.text = rollingX + "\n" +  rollingY + "\n" + rollingZ + "\n"; 
} 
 
function accelRollingAvg(event:AccelerometerEvent):void 
{ 
    rollingX = (event.accelerationX * FACTOR) + (rollingX * (1 - FACTOR)); 
    rollingY = (event.accelerationY * FACTOR) + (rollingY * (1 - FACTOR)); 
    rollingZ = (event.accelerationZ * FACTOR) + (rollingZ * (1 - FACTOR)); 
}

但是,如果加速计更新时间间隔很小,此移动平均数只是理想值。