Intereting Posts
Синхронизация ошибок с репликацией cyanogenmod Как сделать подписанную и запутанную сборку релиза Android из внутреннего затмения? Как отобразить тост внутри обработчика / потока? Перерисовать / обновить Itemizedoverlay? (Android / google maps api) Amazon S3 TransferListener никогда не называется Кордова Android дублирует функции использования двух плагинов EditText setOnFocusChangeListener для всех EditTexts OverScrollBy не всегда возвращается на платформу Lollipop (5.x) Сохранение данных SQLite после обновления Элементы меню «Ящик навигации», выбранные в разных группах Ресурс Android strings.xml – арабский язык и строки с динамическим форматированием Создание коробки с текстурой с одной стороны в libgdx – производительность Как я могу заставить JHC сотрудничать с android ndk? Android: режим звонка, измененный на тихий, не останавливает вибрацию телефона Как отправить простую строку с android на android по nfc?

Получить поворот и отображение в градусах

Мне нужно что-то очень простое, но я не мог найти подходящий пример для изучения. Моя единственная цель заключается в следующем:


Поскольку устройство размещено на столе (плотно) на столе, оно должно показывать 0 (или близко к 0) для оси X и Y. Когда я поднимаю его из верхней части (где находится динамик), а нижняя часть (где находится микрофон) остается подавленной – она ​​должна показывать мне, сколько градусов телефон наклонен. Математически описывается – показывать в градусах угол между задней частью телефона и столом для одной из осей. Когда я поднимаю нижнюю часть (и верхняя часть остается подавленной), тогда показывайте минус градусы.

То же самое касается другой оси – поворот телефона вокруг его длинных сторон.


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

Может ли кто-нибудь дать мне пример функции onSensorChanged (так как вся работа продолжается здесь) и просто скажите мне, какой датчик используется, поэтому я знаю, что регистрировать?

Solutions Collecting From Web of "Получить поворот и отображение в градусах"

В Интернете есть несколько примеров и руководств, но будьте осторожны. Sensor.TYPE_ORIENTATION устарела. Вам необходимо вычислить вращения, прослушивая эти два датчика Sensor.TYPE_ACCELEROMETER и Sensor.TYPE_MAGNETIC_FIELD .

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

 public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) mGravity = event.values; if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) mGeomagnetic = event.values; if (mGravity != null && mGeomagnetic != null) { float R[] = new float[9]; float I[] = new float[9]; boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic); if (success) { float orientation[] = new float[3]; SensorManager.getOrientation(R, orientation); azimut = orientation[0]; // orientation contains: azimut, pitch and roll pitch = orientation[1]; roll = orientation[2]; } } } 

Именно так вы должны вычислять азимуты, высоты тона, значения рулона вашего устройства в onSensorChanged(SensorEvent event) . Имейте в виду, что «все три угла выше находятся в радианах и положительны в направлении против часовой стрелки». Вы можете просто преобразовать их в градусы с помощью Math.toDegrees()

Как отметил Луис САПР в комментариях, рекомендуется переместить инициализацию массивов I, R и ориентации из обратного вызова onSensorChanged, так как он часто называется. Создание, а затем оставление их для GC плохо для производительности ваших приложений. Я оставил его там для простоты.

На основе того, как ваше устройство повернуто, вам может понадобиться переназначить координаты, чтобы получить желаемый результат. Вы можете узнать больше о remapCoordinateSystem а также о getRotationMatrix и getOrientation в документации по Android

Пример кода: http://www.codingforandroid.com/2011/01/using-orientation-sensors-simple.html