2014-04-16 12 views

Odpowiedz

6

Oto pełny przykład, który wykorzystuje Android.Hardware.ISensorEventListener do wykrywania gestu drżenia. Powinieneś być w stanie wrzucić to do własnego projektu (projektów) bez żadnych kłopotów.

[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 
} 

Powyższa aktywność realizuje interfejs Android.Hardware.ISensorEventListener, a następnie rejestruje się przez SensorManager. Rzeczywiste zdarzenia czujnika (wstrząs itp.) Są przesyłane do OnSensorChanged; to tutaj trzymamy logikę naszego kodu wykrywania wstrząsów.

Oparłem tę odpowiedź na this one, ale dokonałem kilku modyfikacji. Po pierwsze, ta odpowiedź używa ISensorEventListener zamiast ISensorListener (która została uznana za przestarzałą na poziomie interfejsu API 3). Znajdziesz w nim funkcję wykrywania gestów początkowych (poprzez hasUpdated) i niektóre zmienne kontrolujące czułość drgań. Grając z ShakeDetectionTimeLapse i ShakeDetectionThreshold powinieneś być w stanie dostosować go do swoich potrzeb.

Patrz:

  1. How to detect shake event with android?
  2. android SensorEventListener problem
+0

dam tego spróbować i poinformować. Dziękuję bardzo :) –

Powiązane problemy