Input accelerometro

Flash Player 10.1 e versioni successive, Adobe AIR 2 e versioni successive

La classe Accelerometer invia eventi in base all'attività rilevata dal sensore di movimento del dispositivo. Questi dati rappresentano la posizione o il movimento del dispositivo lungo un asse tridimensionale. Quando il dispositivo viene spostato, il sensore rileva il movimento e restituisce le coordinate di accelerazione del dispositivo. La classe Accelerometer fornisce i metodi per verificare se l'accelerometro è supportato, nonché per impostare la frequenza di invio degli eventi relativi all'accelerazione.

Gli assi dell'accelerometro vengono normalizzati sull'orientamento di visualizzazione, non l'orientamento fisico del dispositivo. Quando il dispositivo riorienta la visualizzazione, anche gli assi dell'accelerometro vengono riorientati. Pertanto l'asse y è sempre pressoché verticale quando l'utente tiene il telefono in una normale posizione di visualizzazione verticale, a prescindere dal modo in cui il telefono viene ruotato. Se l'orientamento automatico è disattivato, ad esempio, quando il contenuto SWF in un browser è in modalità a schermo intero, gli assi dell'accelerometro non vengono riorientati quando si ruota il dispositivo.

Verifica del supporto accelerometro

Utilizzate la proprietà Accelerometer.isSupported per verificare se l'ambiente di runtime è in grado di utilizzare questa funzione:

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

La classe Accelerometer e i suoi membri sono accessibili alle versioni di runtime elencate per ogni voce API. Tuttavia, l'ambiente corrente in fase di runtime determina la disponibilità di questa funzione. Ad esempio, potete compilare codice utilizzando le proprietà della classe Accelerometer per Flash Player 10.1, ma dovete utilizzare la proprietà Accelerometer.isSupported per verificare la disponibilità della funzione Accelerometer sul dispositivo dell'utente. Se Accelerometer.isSupported è impostata su true in fase di runtime, il supporto accelerometro è attualmente disponibile.

Rilevamento delle modifiche accelerometro

Per utilizzare il sensore accelerometro, create l'istanza di un oggetto Accelerometer ed effettuate la registrazione per gli eventi update che invia. L'evento update è un oggetto evento Accelerometer. L'evento dispone di quattro proprietà ciascuna delle quali sono numeri:

  • accelerationX : accelerazione lungo l'asse x misurata in g. L'asse x va da sinistra a destra del dispositivo quando questo si trova in posizione verticale. (Il dispositivo si trova in posizione verticale quando la parte superiore del dispositivo è rivolta verso l'alto.) L'accelerazione è positiva se il dispositivo si sposta verso destra.

  • accelerationY : accelerazione lungo l'asse y misurata in g. L'asse y va dal basso verso l'alto del dispositivo quando questo si trova posizione verticale. (Il dispositivo si trova in posizione verticale quando la parte superiore del dispositivo è rivolta verso l'alto.) L'accelerazione è positiva se il dispositivo si sposta verso l'alto rispetto a questo asse.

  • accelerationZ : accelerazione lungo l'asse z misurata in g. L'asse Z è perpendicolare alla faccia del dispositivo. L'accelerazione è positiva se il dispositivo viene spostato in modo che la sua faccia sia rivolta verso l'alto. L'accelerazione è negativa se la sua faccia è rivolta verso terra.

  • timestamp : il numero di millisecondi al momento dell'evento da quando il runtime è stato inizializzato.

1 g è l'accelerazione standard dovuta alla forza di gravità, circa 9,8 m/sec 2 .

L'esempio di base riportato di seguito visualizza i dati accelerometro in un campo di testo:

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

Per utilizzare questo esempio, accertatevi di creare il campo di testo accTextField e di aggiungerlo all'elenco di visualizzazione prima di utilizzare questo codice.

Potete regolare l'intervallo di tempo desiderato per gli eventi accelerometro chiamando il metodo setRequestedUpdateInterval() dell'oggetto Accelerometer. Questo metodo accetta un solo parametro, interval , che corrisponde all'intervallo di aggiornamento richiesto in millisecondi:

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

L'intervallo effettivo tra gli aggiornamenti dell'accelerometro può essere maggiore o minore di questo valore. Qualsiasi modifica dell'intervallo di aggiornamento ha effetto su tutti i listener registrati. Se non chiamate il metodo setRequestedUpdateInterval() , l'applicazione riceve gli aggiornamenti in base all'intervallo predefinito del dispositivo.

I dati dell'accelerometro presentano un certo livello di imprecisione. Potete utilizzare una media mobile di dati recenti per uniformare i dati. Nell'esempio seguente viene eseguita la fattorizzazione di letture accelerometro recenti con la lettura attuale per ottenere un risultato arrotondato:

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

Tuttavia, questa media mobile è consigliabile solo se l'intervallo di aggiornamento dell'accelerometro è piccolo.