我看到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
)和一些控制抖动灵敏度的变量。通过玩ShakeDetectionTimeLapse
和ShakeDetectionThreshold
,您应该能够根据自己的需要对其进行微调。
参见:
- 如何用android检测抖动事件
- android SensorEventListener问题