Saisie via un accéléromètre

Flash Player 10.1 et les versions ultérieures, Adobe AIR 2 et les versions ultérieures

La classe Accelerometer distribue des événements en fonction de l’activité détectée par le capteur de mouvement du périphérique. Ces données représentent l’emplacement du périphérique ou un mouvement de ce dernier le long d’un axe tridimensionnel. Lorsque le périphérique se déplace, le capteur détecte le mouvement et renvoie ses coordonnées d’accélération. Les méthodes de la classe Accelerometer permettent de savoir si l’accéléromètre est pris en charge et de définir la fréquence de distribution des événements d’accélération.

Les axes de l’accéléromètre sont normalisés par rapport à l’orientation de l’affichage, plutôt qu’à l’orientation physique du périphérique. Toute modification de l’orientation de l’affichage par le périphérique entraîne la réorientation en conséquence des axes de l’accéléromètre. Par conséquent, l’axe y est toujours plus ou moins vertical lorsque l’utilisateur tient le téléphone dans une position verticale standard, quelle que soit la direction de rotation du téléphone. Si l’orientation automatique est désactivée (lorsque le contenu SWF d’un navigateur est affiché en mode Plain écran, par exemple), les axes de l’accéléromètre ne sont pas réorientés lors de la rotation du périphérique.

Vérification de la prise en charge de l’accéléromètre

La propriété Accelerometer.isSupported permet de vérifier si l’environnement d’exécution prend en charge cette fonction :

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

Les versions du moteur d’exécution indiquées pour chaque entrée d’API peuvent accéder à la classe Accelerometer et à ses membres. L’environnement d’exécution actuel détermine toutefois la disponibilité de la fonction. Vous pouvez, par exemple, compiler du code par le biais des propriétés de la classe Accelerometer pour Flash Player 10.1, mais vous devez faire appel à la propriété Accelerometer.isSupported pour vérifier la disponibilité de la fonction Accelerometer sur le périphérique de l’utilisateur. Si Accelerometer.isSupported est défini sur true à l’exécution, la prise en charge de la fonction Accelerometer est active.

Détection des changements de l’accéléromètre

Pour utiliser le capteur de l’accéléromètre, instanciez un objet Accelerometer et enregistrez-vous pour recevoir les événements update qu’il distribue. Un événement update est un objet d’événement Accelerometer. L’événement possède quatre propriétés, toutes numériques :

  • accelerationX : accélération le long de l’axe x, mesurée en g. L’axe x traverse le périphérique de gauche à droite lorsque l’utilisateur le tient droit. (La partie supérieure du périphérique est alors orientée vers le haut.) L’accélération est positive si le périphérique se déplace vers la droite.

  • accelerationY : accélération le long de l’axe y, mesurée en g. L’axe y traverse le périphérique de bas en haut lorsque l’utilisateur le tient droit. (La partie supérieure du périphérique est alors orientée vers le haut.) L’accélération est positive si le périphérique se déplace vers le haut par rapport à cet axe.

  • accelerationZ : accélération le long de l’axe z, mesurée en g. L’axe z est perpendiculaire à la face du périphérique. L’accélération est positive si vous déplacez le périphérique de sorte que sa face soit orientée vers le haut. L’accélération est négative si la face du périphérique est orientée vers le sol.

  • timestamp : nombre de millisecondes au moment où se produit l’événement après l’initialisation du moteur d’exécution.

1 g correspond à l’accélération standard due à la gravité, soit environ 9,8 m/s2.

Exemple de base qui affiche les données de l’accéléromètre dans un champ de texte :

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

Pour exploiter cet exemple, veillez à créer le champ de texte accTextField et à l’ajouter à la liste d’affichage avant d’utiliser le code.

Vous pouvez ajuster l’intervalle de temps qui sépare les événements de l’accéléromètre en appelant la méthode setRequestedUpdateInterval() de l’objet Accelerometer. Cette méthode ne gère qu’un seul paramètre, interval, qui correspond à la fréquence de mise à jour requise, en millisecondes :

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

L’intervalle réel entre les mises à jour de l’accéléromètre peut être supérieur ou inférieur à cette valeur. Toute modification de l’intervalle de mise à jour affecte l’ensemble des écouteurs enregistrés. Si vous n’appelez pas la méthode setRequestedUpdateInterval(), l’application reçoit des mises à jour à la fréquence définie par défaut sur le périphérique.

Les données de l’accéléromètre ne sont pas d’une précision absolue. Vous pouvez calculer la moyenne mobile des données récentes pour lisser les données. Ainsi, l’exemple suivant prend en compte les données récentes issues de l’accéléromètre et les données en cours pour arrondir le résultat :

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

Le calcul de la moyenne mobile n’est toutefois désirable que si la fréquence de mise à jour de l’accéléromètre est élevée.