2014-04-16 10 views

Antwort

6

Hier ist ein vollständiges Beispiel, das Android.Hardware.ISensorEventListener verwendet, um eine Shake-Geste zu erkennen. Sie sollten dies problemlos in Ihre eigenen Projekte einfügen können.

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

Die obige Aktivität implementiert die Android.Hardware.ISensorEventListener Schnittstelle und registriert sie dann durch die SensorManager. Die tatsächlichen Sensorereignisse (Schütteln usw.) werden an OnSensorChanged weitergeleitet; Hier haben wir die Logik für unseren Shake-Erkennungscode.

Ich habe diese Antwort auf this one basiert, aber habe ein paar Änderungen daran gemacht. Erstens verwendet diese Antwort ISensorEventListener statt ISensorListener (die in API-Ebene 3 veraltet war). Und Sie werden feststellen, Start-Gestenerkennung enthalten (über hasUpdated) und einige Variablen, um die Empfindlichkeit der Shake zu steuern. Indem Sie mit ShakeDetectionTimeLapse und ShakeDetectionThreshold herumspielen, sollten Sie in der Lage sein, es auf Ihre Bedürfnisse abzustimmen.

See:

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

Ich werde diesen einen Versuch geben und Sie wissen lassen. ich danke dir sehr :) –