अनिवार्य रूप से, यहां 2 मामले हैं: डिवाइस फ्लैट बिछा रहा है और फ्लैट नहीं है। यहां फ्लैट का मतलब है कि डिवाइस स्क्रीन की सतह और विश्व एक्सई प्लेन (मैं इसे झुकाव कहता हूं) के बीच कोण 25 डिग्री से कम या 155 डिग्री से बड़ा है। फोन को फ्लैट से झूठ बोलने या टेबल से थोड़ा सा झुकाव के बारे में सोचें।
सबसे पहले आपको एक्सीलरोमीटर वेक्टर को सामान्य करने की आवश्यकता है।
यह है कि जी एक्सेलेरोमीटर सेंसर ईवेंट मानों द्वारा वेक्टर रिटर्न है। कोड में
float[] g = new float[3];
g = event.values.clone();
double norm_Of_g = Math.sqrt(g[0] * g[0] + g[1] * g[1] + g[2] * g[2]);
// Normalize the accelerometer vector
g[0] = g[0]/norm_Of_g
g[1] = g[1]/norm_Of_g
g[2] = g[2]/norm_Of_g
फिर झुकाव के रूप में
int inclination = (int) Math.round(Math.toDegrees(Math.acos(g[2])));
इस प्रकार
if (inclination < 25 || inclination > 155)
{
// device is flat
}
else
{
// device is not flat
}
गणना की जा सकती फ्लैट बिछाने के मामले के लिए, आप एक कम्पास का उपयोग करने के लिए कितना डिवाइस को देखने के लिए शुरुआती स्थिति से घूर्णन कर रहा है।
फ्लैट नहीं होने की स्थिति के लिए, रोटेशन (झुकाव) के रूप में पालन
int rotation = (int) Math.round(Math.toDegrees(Math.atan2(g[0], g[1])));
अब रोटेशन = 0 का मतलब डिवाइस सामान्य स्थिति में है गणना की जाती है। यह अधिकांश फोन के लिए किसी भी झुकाव के बिना चित्र और शायद टैबलेट के लिए परिदृश्य है। तो यदि आप ऊपर अपनी तस्वीर में फोन रखते हैं और घूर्णन शुरू करते हैं, तो रोटेशन बदल जाएगा और जब फोन परिदृश्य में होगा तो रोटेशन 90 या -90 होगा रोटेशन की दिशा पर निर्भर करता है।
स्रोत
2013-03-01 02:23:39
शानदार! आम तौर पर लोग इस कार्य के लिए सेंसर.TYPE_MAGNETIC_FIELD का उपयोग करने का सुझाव देते हैं, हालांकि आपने समाधान को सरल बना दिया है; और जिस तरह एक्सेलेरोमीटर एकमात्र सेंसर है जो एंड्रॉइड पर मौजूद होने की गारंटी देता है। – southerton
क्या मैं आपसे पूछ सकता हूं कि "एसी वेक्टर के सामान्यीकरण" के पीछे गणित क्या है? और डिग्री प्राप्त करने के लिए आप एटान (जी [1]/जी [0]) (या एटन (वाई/एक्स)) क्यों करते हैं? ? @Hoan Nguyen –
@AndreaBaccega मैं भूल गया कि मुझे सामान्यीकृत करने की आवश्यकता क्यों है या बिल्कुल कोई ज़रूरत नहीं है, बस कुछ और चीज़ के लिए मुझे कुछ करने की ज़रूरत है। एटान (वाई/एक्स) बस सरल त्रिकोणमितीय गणना है। घूर्णन को खोजने के लिए, सबसे पहले आपको xy विमान में गुरुत्वाकर्षण प्रोजेक्ट करने की आवश्यकता है। अब अगर कोई रोटेशन नहीं है तो इस प्रोजेक्शन वेक्टर में समन्वय होगा (0,1) (सामान्यीकरण मानना)। यदि डिवाइस घुमाया गया है, तो यह वेक्टर समान है लेकिन निर्देशांक बदलते हैं और इस वेक्टर और डिवाइस वाई-समन्वय के बीच कोण केवल तन (वाई/एक्स) है। –