加速器输入
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));
}
但是,如果加速计更新时间间隔很小,此移动平均数只是理想值。