DeviceOrientation Compass Android - PullRequest
       17

DeviceOrientation Compass Android

1 голос
/ 10 марта 2020

Я пытаюсь реализовать компас, используя событие deviceorientation. Я хочу использовать вращение, чтобы повернуть стрелку в направлении просмотра. Я просто поворачиваю изображение, когда меняется deviceorientation.

Вкл. iOS Это работает как шарм, выполняя следующие действия:

if (typeof DeviceOrientationEvent.requestPermission === "function") {
          //@ts-ignore
          DeviceOrientationEvent.requestPermission()
            .then(permissionState => {
              if (permissionState === "granted") {
                this.compassActive = true;
                window.addEventListener(
                  "deviceorientation",
                  eventData =>
                    this.zone.run(() => {
                      if(!this.compassActive){
                        return false;
                      }
                      //@ts-ignore
                      this.rotatePlayerIcon(eventData.webkitCompassHeading);

                    }),
                  false
                );
              }
            })
            .catch(console.error);

Так как DeviceOrientationEvent.webkitCompassHeading дает мне всемирное представление вращения устройства по часовой стрелке.

Я пробую то же самое на Android, но не могу найти решение, основанное на мире. webkitCompassHeading не существует на android, поэтому я попытался использовать только eventData.alpha. Но это дает 0 на основе вращения, которое было при запуске события, а не на севере мира.

Все руководства, которые я нахожу, кажутся устаревшими.

Как получить компас по часовой стрелке android как у меня на iOS?

Ответы [ 2 ]

0 голосов
/ 15 марта 2020

Проблема в том, что альфа не является абсолютной, это означает, что 0 не является севером, а 0 указывает на то, где устройство указывает на активацию.

Лучший способ исправления для браузеров на основе chrome, как и большинство стандартных Android Браузеры используют AbsoluteOrientationSensor от W3 C Generi c Сенсорные API-полифилы. Github

Проект, в котором я использовал его, основан на Typescript. Итак, вот пример Typescript:

import {AbsoluteOrientationSensor} from 'motion-sensors-polyfill'

const options = { frequency: 60, referenceFrame: 'device' };
        const sensor = new AbsoluteOrientationSensor(options);
        sensor.addEventListener('reading', e => {
          this.zone.run(() => {
            var q = e.target.quaternion;
            let alpha = Math.atan2(2*q[0]*q[1] + 2*q[2]*q[3], 1 - 2*q[1]*q[1] - 2*q[2]*q[2])*(180/Math.PI);
            if(alpha < 0) alpha = 360+ alpha;
            this.alpha = 360 - alpha;
            this.rotatePlayerIcon(360 - alpha)
          })
        });
        sensor.start();
0 голосов
/ 10 марта 2020

ниже вы увидите компас vtm-mapsforge. это также включает стрелу. исходя из обычных датчиков магнитометра и акселерометра, я рекомендую использовать позиционный подшипник, так как датчики не совсем точны и легко разрушаются. Приятная вещь в компасе состоит в том, что он содержит код, который заставляет его вращаться плавно, так как исходный выход от датчиков часто шумно

Для кода Java посмотрите это , это оригинальная версия компаса vtm-mapsforge

...