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

jas*_*meg 6 c# android xamarin

我看到Xamarin有创建手势监听器的文档,但没有关于"摇动"设备只是在屏幕上"晃动".我想知道Android的Xamarin是否能够倾听摇动手势?有人知道或有人试过吗?先感谢您.

mat*_*dev 8

这是一个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
}
Run Code Online (Sandbox Code Playgroud)

上面的活动实现了Android.Hardware.ISensorEventListener接口,然后通过它注册它SensorManager.实际传感器事件(摇动等)通过管道传输OnSensorChanged; 这是我们为摇动检测代码保留逻辑的地方.

我的答案基于这个,但对它进行了一些修改.首先,这个答案使用ISensorEventListener而不是ISensorListener(在API级别3中已弃用).并且你会发现包括(通过hasUpdated)开始手势检测和一些变量来控制震动的灵敏度.通过玩耍ShakeDetectionTimeLapse,ShakeDetectionThreshold你应该能够根据自己的需要进行微调.

看到:

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