2014-04-16 7 views
6

मुझे लगता है कि ज़ैमरिन के पास Creating a Gesture Listener के लिए दस्तावेज़ हैं लेकिन स्क्रीन पर 'हिलाने' डिवाइस के बारे में कुछ भी नहीं है। मैं सोच रहा हूं कि एंड्रॉइड के लिए एक्समरिन शेक जेस्चर के लिए सुनने में सक्षम है? क्या कोई जानता है या किसी ने कोशिश की है? पहले ही, आपका बहुत धन्यवाद।क्या एक्समरिन एंड्रॉइड पर शेक एक्सेलेरोमीटर संभाल सकता है?

उत्तर

6

यहां एक पूरा उदाहरण है जो शेक इशारा का पता लगाने के लिए 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 में पाइप की जाती हैं; यह वह जगह है जहां हम अपने शेक पहचान कोड के लिए तर्क रखते हैं।

मैंने इस उत्तर को this one पर आधारित किया है लेकिन इसमें कुछ संशोधन किए हैं। सबसे पहले, यह उत्तर ISensorEventListener का उपयोग ISensorListener (जिसे एपीआई स्तर 3 में बहिष्कृत किया गया था) के बजाय करता है। और आपको प्रारंभिक इशारा पता लगाना होगा (hasUpdated के माध्यम से) और शेक की संवेदनशीलता को नियंत्रित करने के लिए कुछ चर। ShakeDetectionTimeLapse और ShakeDetectionThreshold के साथ खेलकर आप इसे अपनी आवश्यकताओं के अनुरूप ट्यून करने में सक्षम होना चाहिए।

देखें:

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

मैं इस आजमाइए और आपको बता देगा। बहुत बहुत धन्यवाद :) –

संबंधित मुद्दे