Реагировать на слушателя Native Expo без изменения ориентации - PullRequest
2 голосов
/ 23 февраля 2020

Я пытаюсь определить текущую ориентацию в моем приложении React Native без необходимости изменения ориентации. Я сделал приложение для камеры и хочу переворачивать значки только при изменении ориентации. Сейчас я не могу использовать ScreenOrientation.addOrientationChangeListener(listener) без фактического изменения ориентации. Есть ли способы обойти это?

Ответы [ 2 ]

2 голосов
/ 23 февраля 2020

Если я вас правильно понимаю, требование состоит в том, чтобы получить ориентацию устройства, даже если фактическая ориентация не была изменена, поскольку она заблокирована orientation.

Вы можете использовать DeviceMotion модуль для получения поворота устройства ( угол Эйлера )

DeviceMotion.addListener(({rotation}) => {
  const alpha = Math.abs(rotation.alpha);
  this.setState({
    orientation: alpha > 3 || (alpha > 0 && alpha < 0.5) ? 'landscape' : 'protrait'
  });
});

Демонстрационная версия: https://expo.io/@moshfeu / snack-dc115508-fab4-4be4 -818a-5a03f89725bd

Старый ответ

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

Если это так вы можете получить его из ScreenOrientation.getOrientationAsync(), который вернет Promise с одним из возможных значений

ScreenOrientation.getOrientationAsync().then(data => this.setState({data}));

Пример в реальном времени: https://snack.expo.io/@moshfeu / ff4c76

0 голосов
/ 05 мая 2020

Я нашел другое решение на GitHub , похожее на Mo sh Ответ Феу с использованием DeviceMotion, но с использованием гаммы и бета (ось x и y) вместо альфа (ось z) ) выяснить вращение устройства. В моем случае я достиг более удовлетворительного результата с этой техникой.

isPortrait(gamma: number, beta: number) {
 const ABSOLUTE_GAMMA = Math.abs(gamma);
 const ABSOLUTE_BETA = Math.abs(beta);
 const isGammaNegative = Math.sign(gamma) === -1;

 if (ABSOLUTE_GAMMA <= 0.04 && ABSOLUTE_BETA <= 0.24) {
  //Portrait mode, on a flat surface.
  return true;
 } else 
 if (
   (ABSOLUTE_GAMMA <= 1.0 || ABSOLUTE_GAMMA >= 2.3) &&
   ABSOLUTE_BETA >= 0.5
 ) {
   //General Portrait mode, accounting for forward and back tilt on the top of the phone.
   return true;
 } else {
   if (isGammaNegative) {
     //Landscape mode with the top of the phone to the left.
     return false;
   } else {
     //Landscape mode with the top of the phone to the right.
     return false;
   }
 }
}

И я вызываю его в слушателе из метода componentDidMount ( рекомендуется сначала проверить доступность датчика с помощью DeviceMotion.isAvailableAsyn c () ):

const sensorAvailable = await DeviceMotion.isAvailableAsync();
if (sensorAvailable) {
 DeviceMotion.addListener(({ rotation }) => {
  const { gamma, beta } = rotation;
  this.setState({
    orientation: this.isPortrait(gamma, beta) ? 'portrait' : 'landscape'
   });
  });
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...