Xamarin.Essentials: Обнаружение встряхивания
Класс Accelerometer позволяет считывать данные с датчика акселерометра устройства, который показывает ускорение устройства в трехмерном пространстве. Кроме того, он позволяет регистрировать события, когда пользователь трясет устройство.
Начало работы
Чтобы начать использовать этот API, ознакомьтесь с руководством по началу работы с Xamarin.Essentials, чтобы правильно настроить и установить библиотеку в проектах.
Использование обнаружения тряски
Добавьте ссылку на Xamarin.Essentials в своем классе:
using Xamarin.Essentials;
Для обнаружения тряски устройства необходимо использовать функциональные возможности акселерометра, вызвав методы Start
и Stop
для прослушивания изменений ускорения и обнаружения тряски. При каждом обнаружении встряхивания срабатывает событие ShakeDetected
. Рекомендуется использовать для SensorSpeed
значение Game
или указать более высокую скорость. Пример использования:
public class DetectShakeTest
{
// Set speed delay for monitoring changes.
SensorSpeed speed = SensorSpeed.Game;
public DetectShakeTest()
{
// Register for reading changes, be sure to unsubscribe when finished
Accelerometer.ShakeDetected += Accelerometer_ShakeDetected ;
}
void Accelerometer_ShakeDetected (object sender, EventArgs e)
{
// Process shake event
}
public void ToggleAccelerometer()
{
try
{
if (Accelerometer.IsMonitoring)
Accelerometer.Stop();
else
Accelerometer.Start(speed);
}
catch (FeatureNotSupportedException fnsEx)
{
// Feature not supported on device
}
catch (Exception ex)
{
// Other error has occurred.
}
}
}
Скорость датчика
- Fastest (Максимальная) — максимально быстрое получение данных датчика (возврат в поток пользовательского интерфейса не гарантирован).
- Game (Игра) — скорость, подходящая для игр (возврат в поток пользовательского интерфейса не гарантирован).
- Normal (Нормальная) — скорость по умолчанию, которая подходит для изменений ориентации экрана.
- UI (Пользовательский интерфейс) — скорость, которая подходит для типичного пользовательского интерфейса.
Если нет гарантии, что обработчик событий будет запущен в потоке пользовательского интерфейса, и этому обработчику событий требуется доступ к элементам интерфейса, используйте метод MainThread.BeginInvokeOnMainThread
для запуска кода в потоке пользовательского интерфейса.
Сведения о реализации
Для обнаружения тряски API использует необработанные показания акселерометра для вычисления ускорения. Он использует простой механизм очереди для определения того, произошло ли 3/4 последних событий акселерометра за последнюю половину секунды. Ускорение рассчитывается путем добавления квадрата показаний X, Y и Z от акселерометра и его сравнения с определенным порогом.