2014-11-24 14 views
7

में मुझे कुछ बहुत आसान चाहिए, लेकिन मुझे सीखने के लिए एक उपयुक्त उदाहरण नहीं मिला। मेरे एकमात्र उद्देश्य निम्नलिखित है:रोटेशन प्राप्त करें और डिग्री


के रूप में डिवाइस फ्लैट रखा गया है मेज पर (अपनी पीठ पर), यह एक्स और वाई अक्ष के लिए 0 (या 0 के करीब) दिखाना चाहिए। जब मैं इसे शीर्ष भाग (जहां स्पीकर होता है) से उठाता है और नीचे का हिस्सा (जहां माइक्रोफ़ोन होता है) रहता है - यह मुझे दिखाएगा कि फ़ोन कितनी डिग्री झुका हुआ है। गणितीय रूप से वर्णित - अक्षरों में से एक के लिए फोन और तालिका के पीछे कोण कोण में डिग्री दिखाएं। जब मैं नीचे भाग उठाता हूं (और शीर्ष भाग नीचे रहता है) तो शून्य डिग्री दिखाएं।

यह अन्य धुरी के लिए जाता है - फोन को अपने लंबे किनारे के चारों ओर घुमाता है।


मैं विभिन्न उदाहरणों से कोई एप्लिकेशन कोडांतरण की कोशिश की, जाइरोस्कोप या Accelerometer या रोटेशन वेक्टर सेंसर का उपयोग करते हुए, लेकिन कुछ ठीक से काम के साथ नहीं आ सकता है।

क्या कोई मुझे onSensorChanged फ़ंक्शन का उदाहरण दे सकता है (जैसा कि सभी काम यहां चलते हैं) और बस मुझे बताएं कि कौन सा सेंसर उपयोग किया जाता है, इसलिए मुझे पता है कि पंजीकरण करना क्या है?

उत्तर

13

वेब पर कुछ उदाहरण और ट्यूटोरियल हैं, लेकिन सावधान रहें। Sensor.TYPE_ORIENTATION बहिष्कृत हो गया। आपको इन दो सेंसर Sensor.TYPE_ACCELEROMETER और Sensor.TYPE_MAGNETIC_FIELD को सुनकर घूर्णन की गणना करने की आवश्यकता है।

इन सेंसर से अधिसूचनाएं प्राप्त करने के लिए पंजीकरण करने के बाद मुश्किल हिस्सा यह पता लगाने के लिए है कि उनसे प्राप्त डेटा को कैसे संभाला जाए।

public void onSensorChanged(SensorEvent event) { 
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) 
     mGravity = event.values; 

    if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) 
     mGeomagnetic = event.values; 

    if (mGravity != null && mGeomagnetic != null) { 
     float R[] = new float[9]; 
     float I[] = new float[9]; 

     boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic); 
     if (success) { 
      float orientation[] = new float[3]; 
      SensorManager.getOrientation(R, orientation); 
      azimut = orientation[0]; // orientation contains: azimut, pitch and roll 
      pitch = orientation[1]; 
      roll = orientation[2]; 
     } 
    } 
} 

इस तरह आप onSensorChanged(SensorEvent event) कॉलबैक में दिगंश, पिच, रोल अपने डिवाइस के मूल्यों की गणना की जानी चाहिए: महत्वपूर्ण हिस्सा इस प्रकार है। ध्यान रखें कि "उपरोक्त सभी तीन कोण रेडियंस में हैं और विपरीत दिशा में सकारात्मक हैं"। आप बस Math.toDegrees()

के रूप में लुई सीएडी टिप्पणी में बताया साथ डिग्री करने के लिए उन्हें परिवर्तित कर सकते हैं, यह एक अच्छा विचार onSensorChanged कॉलबैक से बाहर मैं, आर और अभिविन्यास सरणियों के प्रारंभ स्थानांतरित करने के लिए है यह अक्सर कहा जाता है के बाद से । जीसी के लिए उन्हें पीछे छोड़कर और पीछे छोड़ना आपके ऐप्स के प्रदर्शन के लिए खराब है। मैंने सादगी के लिए वहां छोड़ा।

आपके डिवाइस को घुमाने के तरीके के आधार पर आपको परिणाम प्राप्त करने के लिए निर्देशांक को रीमेप करने की आवश्यकता हो सकती है। आप remapCoordinateSystem के बारे में अधिक है और यह भी के बारे में getRotationMatrix और getOrientation पढ़ सकते हैं android documentation

उदाहरण कोड में: http://www.codingforandroid.com/2011/01/using-orientation-sensors-simple.html

+0

हाय कसाबा, मैं अपने उदाहरण का पालन किया है और यह बहुत विश्वसनीय मान प्रदान करता है, लेकिन मैं इन प्राप्त करना चाहता था घड़ी की दिशा में सकारात्मक मूल्य यह संभव है? मुझे आपके मौजूदा कोड में क्या परिवर्तन करने की ज़रूरत है? –

+0

@ParagKadam मुझे लगता है कि आपको 360 से काउंटर-घड़ी की डिग्री कम करने की आवश्यकता है और आपको घड़ी की दिशा में इस तरह की डिग्री मिलती है: 'फ्लोट घड़ी की दिशा = 360 - काउंटरक्लॉक वार;' तो यदि काउंटर-घड़ी के मूल्य 15 वर्ष के थे, तो दक्षिणावर्त मूल्य 345 है। –

+0

हाँ वास्तव में ... इसके लिए बहुत बहुत धन्यवाद :) –

0

फ़ाइल layouts.xml बनाएं फ़ोल्डरों res/values-land और res/values-port निम्नलिखित सामग्री के साथ:

रेस/मूल्य-भूमि/layouts.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <bool name="is_landscape">true</bool> 
</resources> 

res/values-port/layouts।xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <bool name="is_landscape">false</bool> 
</resources> 

अपने स्रोत कोड में आप अब वर्तमान उन्मुखीकरण के रूप में इस का उपयोग कर सकते हैं:

context.getResources().getBoolean(R.bool.is_landscape) 
संबंधित मुद्दे