Xamarin可以在Android上处理抖动加速度计吗



我看到Xamarin有创建手势监听器的文档,但没有关于"摇晃"设备的文档,只是在屏幕上"投掷"。我想知道安卓版的Xamarin是否能够监听抖动手势?有人知道或尝试过吗?提前谢谢。

下面是一个使用Android.Hardware.ISensorEventListener检测抖动手势的完整示例。你应该能够把它放到你自己的项目中,而不会有任何麻烦。

[Activity (Label = "ShakeDetection", MainLauncher = true)]
public class MainActivity : Activity, Android.Hardware.ISensorEventListener
{
    bool hasUpdated = false;
    DateTime lastUpdate;
    float last_x = 0.0f;
    float last_y = 0.0f;
    float last_z = 0.0f;
    const int ShakeDetectionTimeLapse = 250;
    const double ShakeThreshold = 800;
    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);
        SetContentView (Resource.Layout.Main);
        // Register this as a listener with the underlying service.
        var sensorManager = GetSystemService (SensorService) as Android.Hardware.SensorManager;
        var sensor = sensorManager.GetDefaultSensor (Android.Hardware.SensorType.Accelerometer);
        sensorManager.RegisterListener(this, sensor, Android.Hardware.SensorDelay.Game);
    }
    #region Android.Hardware.ISensorEventListener implementation
    public void OnAccuracyChanged (Android.Hardware.Sensor sensor, Android.Hardware.SensorStatus accuracy)
    {
    }
    public void OnSensorChanged (Android.Hardware.SensorEvent e)
    {
        if (e.Sensor.Type == Android.Hardware.SensorType.Accelerometer)
        {
            float x = e.Values[0];
            float y = e.Values[1];
            float z = e.Values[2];
            DateTime curTime = System.DateTime.Now;
            if (hasUpdated == false)
            {
                hasUpdated = true;
                lastUpdate = curTime;
                last_x = x;
                last_y = y;
                last_z = z;
            }
            else
            {
                if ((curTime - lastUpdate).TotalMilliseconds > ShakeDetectionTimeLapse) {
                    float diffTime = (float)(curTime - lastUpdate).TotalMilliseconds;
                    lastUpdate = curTime;
                    float total = x + y + z - last_x - last_y - last_z;
                    float speed = Math.Abs(total) / diffTime * 10000;
                    if (speed > ShakeThreshold) {
                        Toast.MakeText(this, "shake detected w/ speed: " + speed, ToastLength.Short).Show();
                    }
                    last_x = x;
                    last_y = y;
                    last_z = z;
                }
            }
        }
    }
    #endregion
}

上述活动实现了Android.Hardware.ISensorEventListener接口,然后通过SensorManager进行注册。实际传感器事件(抖动等)通过管道传输到OnSensorChanged;这就是我们的抖动检测代码的逻辑所在。

我在这个答案的基础上给出了这个答案,但对它做了一些修改。首先,这个答案使用的是ISensorEventListener,而不是ISensorListener(这在API 3级中被弃用)。你会发现包括启动手势检测(通过hasUpdated)和一些控制抖动灵敏度的变量。通过玩ShakeDetectionTimeLapseShakeDetectionThreshold,您应该能够根据自己的需要对其进行微调。

参见:

  1. 如何用android检测抖动事件
  2. android SensorEventListener问题

最新更新