Obtenez de rotation et affichage en degrés
J'ai besoin de quelque chose de très simple, mais je ne pouvais pas trouver un exemple d'apprendre à partir. Mon seul but est le suivant:
Que l'appareil est placé à plat (sur son dos) sur le bureau, il devrait afficher 0 (ou proche de 0) pour X et Y de l'axe. Quand je lève à partir de la partie supérieure (où l'orateur) et la partie inférieure (où le microphone est) reste en place, elle doit me montrer combien de degrés le téléphone est incliné. Mathématiquement décrit - afficher en degrés de l'angle entre la face arrière du téléphone et de la table, pour l'un des axes. Quand je lève la partie inférieure (et la partie supérieure reste en place en bas) puis montrer moins degrés.
Va de même pour les autres de l'axe de rotation du téléphone autour de ses longs côtés.
J'ai essayé de créer une application à partir de différents exemples, en utilisant le Gyroscope ou l'Accéléromètre ou le Vecteur de Rotation des Capteurs, mais ne pouvait pas venir avec quelque chose fonctionne correctement.
Quelqu'un peut-il me donner un exemple de la onSensorChanged
fonction (comme tout le travail se passe ici) et dis-moi seulement que le capteur est utilisé, donc je sais à quoi m'inscrire?
OriginalL'auteur Milkncookiez | 2014-11-24
Vous devez vous connecter pour publier un commentaire.
Il y a peu d'exemples et de tutoriels sur le web, mais être prudent.
Sensor.TYPE_ORIENTATION
est devenu obsolète. Vous devez calculer les rotations par l'écoute de ces deux capteursSensor.TYPE_ACCELEROMETER
etSensor.TYPE_MAGNETIC_FIELD
.La partie la plus délicate après votre inscription pour recevoir des notifications à partir de ces capteurs, est de comprendre comment gérer les données reçues d'eux. L'élément clé est la suivante:
C'est la façon dont vous devez être le calcul de l'azimut, le tangage, le roulis des valeurs de votre appareil dans la
onSensorChanged(SensorEvent event)
de rappel. Gardez à l'esprit que "Tous les trois angles ci-dessus sont en radians et positif dans le sens anti-horaire". Vous pouvez simplement convertir en degrés avecMath.toDegrees()
Louis CAD souligné dans les commentaires, c'est une bonne idée de déplacer l'initialisation du I de R et à l'orientation des tableaux de la onSensorChanged de rappel, car il est fréquemment appelé. La création et ensuite de les laisser derrière pour la GC est mauvais pour les performances de vos applications. Je l'ai laissé là par souci de simplicité.
Basé sur la façon dont votre appareil est tourné vous devrez peut-être reconfigurer les coordonnées pour obtenir le résultat que vous souhaitez. Vous pouvez en lire plus à propos de
remapCoordinateSystem
et aussi surgetRotationMatrix
etgetOrientation
dans le android documentationExemple de code:
http://www.codingforandroid.com/2011/01/using-orientation-sensors-simple.html
Je suppose que vous avez juste besoin de soustraire le sens anti-horaire à partir de 360 degrés et vous avez le sens des aiguilles d'degré comme ceci:
float clockwise = 360 - counterClockwise;
Donc, si le sens anti-horaire, la valeur était de 15, puis le sens des aiguilles d'une valeur 345.La création d'un nouvel objet (
new float[]
) dans une souvent appelée méthode est mal en point de vue des performances. Vous devez déplacer ces tableaux pour les membresMerci @LouisCAD, C'est un bon point. J'ai inclus une note dans la réponse au point de la performance de pénalité qui vient de l'utilisation locale des tableaux à la place de membre.
Vous pouvez utiliser un simple filtre passe-Bas pour cela. Si vous la recherche pour "lissage des données de capteur", vous pouvez trouver beaucoup de réponses, par exemple celui-ci: lien
OriginalL'auteur Csaba Szugyiczki