要使用加速计传感器,请实例化 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));
}
但是,如果加速计更新时间间隔很小,此移动平均数只是理想值。