Entrada de acelerómetro

Flash Player 10.1 y posterior, Adobe AIR 2 y posterior

La clase Accelerometer distribuye eventos basados en la actividad detectada por el sensor de movimiento del dispositivo. Estos datos representan la ubicación del dispositivo o el movimiento a lo largo de un eje tridimensional. Cuando el dispositivo se mueve, el sensor detecta este movimiento y devuelve las coordenadas de aceleración del dispositivo. La clase Accelerometer proporciona métodos para consultar si se admite o no acelerómetro y también para definir los eventos de aceleración que se distribuyen.

Los ejes del acelerómetro se normalizan en la orientación de la pantalla, no en la orientación física del dispositivo. Cuando el dispositivo reorienta la pantalla, los ejes del acelerómetro también se reorientan. De este modo, el eje y siempre es casi vertical cuando el usuario sostiene el teléfono en una posición de visualización normal en orientación vertical; no importa en qué dirección se gire el teléfono. Si la orientación automática está desactivada como, por ejemplo, cuando el contenido SWF en un navegador está en modo de pantalla completa, los ejes del acelerómetro no se reorientan conforme se gira el dispositivo.

Adobe recomienda

Flash Pro CS5.5 Mobile (Android/iOS) – Part 2: Project 2 Accelerometer and Debugging (Flash Pro CS5.5 para móvil (Android/iOS) – Parte 2: Proyecto 2: Acelerómetro y depuración, en inglés)

Antonio Holguin

AIR and the Accelerometer (AIR y el acelerómetro, en inglés)

Michaël Chaize

Air for Android: Accelerometer (AIR for Android: Acelerómetro, en inglés)

Jonathan Campos

Comprobación de la compatibilidad del acelerómetro

Utilice la propiedad Accelerometer.isSupported para probar si el entorno del motor de ejecución tiene capacidad para usar esta función:

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

La clase Accelerometer y sus miembros son accesibles para las versiones del motor de ejecución incluidas en cada entrada de la API. Sin embargo, el entorno actual en tiempo de ejecución determina la disponibilidad de esta función. Por ejemplo, puede compilar código usando las propiedades de la clase Accelerometer para Flash Player 10.1, pero deberá usar la propiedad Accelerometer.isSupported para comprobar la disponibilidad de la función Accelerometer en el dispositivo del usuario. Si Accelerometer.isSupported es true en tiempo de ejecución, se admite la función Accelerometer.

Detección de cambios del acelerómetro

Para utilizar el sensor del acelerómetro, cree una instancia del objeto Accelerometer y registre los eventos update que distribuya. El evento update es un objeto de evento Accelerometer. Este evento tiene cuatro propiedades y todas son números:

  • accelerationX : aceleración en el eje x, medida en g. El eje x se ejecuta de izquierda a derecha en el dispositivo cuando está en la posición vertical. (El dispositivo está en orientación vertical y con la parte superior hacia arriba.) La aceleración es positiva si el dispositivo se mueve hacia la derecha.

  • accelerationY : aceleración en el eje y, medida en g. El eje y se ejecuta de abajo arriba en el dispositivo cuando está en la posición vertical. (El dispositivo está en orientación vertical y con la parte superior hacia arriba.) La aceleración es positiva si el dispositivo se mueve hacia arriba con relación a este eje.

  • accelerationZ : aceleración en el eje z, medida en g. El eje z se ejecuta perpendicular a la cara del dispositivo. La aceleración es positiva si mueve el dispositivo de modo que la parte frontal apunte hacia arriba. La aceleración es negativa si la parte frontal del dispositivo apunta hacia el suelo.

  • timestamp : el número de milisegundos en el momento del evento desde que se inicializó el motor de ejecución.

1 g es la aceleración estándar debida a la gravedad, aproximadamente 9,8 m/s 2. .

A continuación incluimos un ejemplo básico que muestra datos del acelerómetro en un campo de texto:

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() 
}

Para usar este ejemplo, debe crear un campo de texto accTextField y añadirlo a la lista de visualización antes de utilizar este código.

Puede ajustar el intervalo de tiempo deseado para los eventos de acelerómetro llamando al método setRequestedUpdateInterval() del objeto Accelerometer. Este método toma un parámetro, interval , que es el intervalo de actualización requerido, en milisegundos:

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

El tiempo real entre las actualizaciones de acelerómetro puede ser mayor o menor que este valor. Cualquier cambio en el intervalo de actualización afecta a todos los detectores registrados. Si no llama al método setRequestedUpdateInterval() , la aplicación recibe actualizaciones basadas en el intervalo predeterminado del dispositivo.

Los datos del acelerómetro tienen cierto grado de imprecisión. Puede utilizar una media aproximada de los datos recientes para mejorar los datos. Por ejemplo, a continuación se analizan diversas lecturas recientes del acelerómetro con la lectura actual para obtener un resultado redondeado:

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)); 
}

Sin embargo, esta media aproximada solo es deseable si el intervalo de actualización del acelerómetro es pequeño.