2014-04-16 24 views

cevap

6

Bir titreme hareketini algılamak için Android.Hardware.ISensorEventListener'u kullanan tam bir örnek. Bunu, kendi projelerinize herhangi bir güçlük çekmeden bırakabilmelisiniz.

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

üzerinde aktivite Android.Hardware.ISensorEventListener arabirimi uygulayan ve SensorManager içinden kaydeder. Gerçek sensör olayları (sarsıntı vb.) OnSensorChanged; Bu, sarsıntı tespit kodumuz için mantığı tuttuğumuz yerdir.

Bu cevabı this one numaralı telefondan aldım ancak üzerinde birkaç değişiklik yaptım. Öncelikle, bu cevap ISensorListener yerine API1 düzeyindeki kullanımdan kaldırılmış ISensorEventListener kullanır. Ve (hasUpdated aracılığıyla) başlangıç ​​hareketi algılama ve sarsıntı duyarlılığını kontrol etmek için bazı değişkenler bulacaksınız. ShakeDetectionTimeLapse ve ShakeDetectionThreshold ile oynayarak, bunları ihtiyaçlarınıza göre ayarlayabilmeniz gerekir.

Bkz:

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

Bu denemeye & size bildiririz. çok teşekkür ederim :) –