2010-12-07 15 views
115

मैं हाल ही में कुछ वेबसाइटों पर आया हूं जो मेरे लैपटॉप पर एक्सेलेरोमीटर या जीरोस्कोप तक पहुंचने लगते हैं, जो अभिविन्यास या आंदोलन में परिवर्तन का पता लगाते हैं।जावास्क्रिप्ट से एक्सेलेरोमीटर/जीरोस्कोप डेटा तक कैसे पहुंचे?

यह कैसे किया जाता है? क्या मुझे window ऑब्जेक्ट पर किसी प्रकार की घटना की सदस्यता लेनी चाहिए?

किस डिवाइस पर (लैपटॉप, मोबाइल फोन, टैबलेट) काम करने के लिए जाना जाता है?


नायब: मैं वास्तव में पहले से ही (का हिस्सा) इस सवाल का जवाब पता है, और मैं इसे तुरंत पोस्ट करने के लिए जा रहा हूँ। कारण मैं यहां प्रश्न पोस्ट कर रहा हूं, यह है कि सभी को यह पता होना चाहिए कि एक्सेलेरोमीटर डेटा जावास्क्रिप्ट (कुछ उपकरणों पर) में उपलब्ध है और इस विषय पर नए निष्कर्ष पोस्ट करने के लिए समुदाय को चुनौती देने के लिए है। वर्तमान में, इन सुविधाओं का लगभग कोई दस्तावेज प्रतीत नहीं होता है।

+0

महान प्रयास, बहुत बहुत शुक्रिया। क्या आपको लगता है कि 3 साल बाद उत्तर को किसी भी अपडेट की आवश्यकता है? –

+0

@ BartekBanachewicz मुझे इस पर फोन करने के लिए धन्यवाद। मैं जवाब को "समुदाय विकी" में स्थानांतरित कर दूंगा, उम्मीद कर रहा हूं कि अधिक अद्यतित ज्ञान वाले व्यक्ति को कला की वर्तमान स्थिति को दर्शाने के लिए इसे अपडेट किया जाएगा। –

+0

मुझे यह नहीं मिला कि इस ऑपरेशन को उपयोगकर्ता सहमति की आवश्यकता है या नहीं। मैं एक नया सवाल नहीं बनाना चाहता था क्योंकि यह आपके प्रश्न के साथ पूरी तरह से फिट बैठता है। शायद हम इसे यहां जोड़ सकते हैं? क्या किसी को पता है कि क्या इसे स्पष्ट सहमति की आवश्यकता है? क्या यह सभी ब्राउज़रों और सभी मोबाइल ओएस में मामला है? – Silver

उत्तर

162

वर्तमान में तीन अलग-अलग ईवेंट हैं जो क्लाइंट डिवाइस चलते समय ट्रिगर हो सकते हैं या नहीं भी हो सकते हैं। उनमें से दो गति पर पिछले उन्मुखीकरण के आसपास केंद्रित कर रहे हैं और:

  • ondeviceorientation Chrome के डेस्कटॉप संस्करण पर काम करने के लिए जाना जाता है, और सबसे एप्पल लैपटॉप हार्डवेयर काम करने के लिए इस के लिए आवश्यक है लगता है । यह आईओएस 4.2 के साथ आईफोन 4 पर मोबाइल सफारी पर भी काम करता है। ईवेंट हैंडलर फ़ंक्शन में, आप फ़ंक्शन के लिए केवल तर्क के रूप में प्रदान किए गए ईवेंट डेटा पर alpha, beta, gamma मानों तक पहुंच सकते हैं।

  • onmozorientation फ़ायरफ़ॉक्स 3.6 और नए पर समर्थित है। फिर, यह ज्यादातर ऐप्पल लैपटॉप पर काम करने के लिए जाना जाता है, लेकिन एक्सेलेरोमीटर के साथ विंडोज या लिनक्स मशीनों पर भी काम कर सकता है। ईवेंट हैंडलर फ़ंक्शन में, x, y, z फ़ील्ड को पहले तर्क के रूप में प्रदान किए गए ईवेंट डेटा पर देखें।

  • ondevicemotion आईफोन 3 जीएस + 4 और आईपैड (आईओएस 4.2 के साथ दोनों) पर काम करने के लिए जाना जाता है, और क्लाइंट डिवाइस के वर्तमान त्वरण से संबंधित डेटा प्रदान करता है। हैंडलर समारोह के लिए पारित घटना डेटा acceleration और accelerationIncludingGravity, जो दोनों प्रत्येक अक्ष के लिए तीन क्षेत्रों है है: x, y, z

"भूकंप का पता लगाने" नमूना वेबसाइट if बयान की एक श्रृंखला का उपयोग करता है यह पता लगाने की जो घटना के लिए देते हैं (कुछ हद तक एक प्राथमिकता के आधार पर क्रम में) और डेटा एक आम tilt कार्य करने के लिए प्राप्त करने के लिए गुजरता है:

if (window.DeviceOrientationEvent) { 
    window.addEventListener("deviceorientation", function() { 
     tilt([event.beta, event.gamma]); 
    }, true); 
} else if (window.DeviceMotionEvent) { 
    window.addEventListener('devicemotion', function() { 
     tilt([event.acceleration.x * 2, event.acceleration.y * 2]); 
    }, true); 
} else { 
    window.addEventListener("MozOrientation", function() { 
     tilt([orientation.x * 50, orientation.y * 50]); 
    }, true); 
} 

निरंतर कारकों 2 और 50 दो से "align" करने के लिए उपयोग किया जाता है रीडिंग पहले के उन लोगों के साथ बाद की घटनाएं, लेकिन सटीक प्रतिनिधित्व से नहीं हैं।इस सरल "खिलौना" परियोजना के लिए यह ठीक काम करता है, लेकिन यदि आपको कुछ और गंभीर के लिए डेटा का उपयोग करने की आवश्यकता है, तो आपको विभिन्न घटनाओं में प्रदान किए गए मूल्यों की इकाइयों से परिचित होना होगा और सम्मान के साथ उनका इलाज करना होगा :)

+6

कभी-कभी एक जवाब सिर्फ इसे नाखून करता है! –

+1

किसी के भी आश्चर्य के मामले में - ondevicemotion फ़ायरफ़ॉक्स 8.0 के लिए काम करता है लेकिन गलत तरीके से स्केल किया जाता है (0-9), लेकिन ऐसा लगता है कि बाद के संस्करणों (10.0) में तय किया गया है। उनमें से कोई भी ओपेरा मोबाइल पर काम नहीं करता है और सभी मानक डिफ़ॉल्ट नोकिया एन 9 ब्राउज़र पर ठीक काम करते हैं। – Nux

+1

मोज़ाऑरिएंटेशन ईवेंट को फ़ायरफ़ॉक्स 6 में अप्रचलित के रूप में हटा दिया गया था। तो अब वे सभी मानकीकृत API का उपयोग कर रहे हैं। –

17

अन्य पोस्ट में उत्कृष्ट स्पष्टीकरण के लिए कोई टिप्पणी नहीं जोड़ सकता है लेकिन यह उल्लेख करना चाहता था कि एक महान प्रलेखन स्रोत here पाया जा सकता है।

यह बहुत की तरह accelerometer के लिए एक घटना समारोह रजिस्टर करने के लिए पर्याप्त है:

if(window.DeviceMotionEvent){ 
    window.addEventListener("devicemotion", motion, false); 
}else{ 
    console.log("DeviceMotionEvent is not supported"); 
} 
हैंडलर के साथ

:

function motion(event){ 
    console.log("Accelerometer: " 
    + event.accelerationIncludingGravity.x + ", " 
    + event.accelerationIncludingGravity.y + ", " 
    + event.accelerationIncludingGravity.z 
); 
} 

और मैग्नेटोमीटर के लिए एक निम्न इवेंट हैंडलर पंजीकृत किया जाना है:

if(window.DeviceOrientationEvent){ 
    window.addEventListener("deviceorientation", orientation, false); 
}else{ 
    console.log("DeviceOrientationEvent is not supported"); 
} 

हैंडलर के साथ:

function orientation(event){ 
    console.log("Magnetometer: " 
    + event.alpha + ", " 
    + event.beta + ", " 
    + event.gamma 
); 
} 

एक जीरोस्कोप के लिए गति घटना में निर्दिष्ट फ़ील्ड भी हैं लेकिन यह सार्वभौमिक रूप से समर्थित नहीं है (उदा। यह सैमसंग गैलेक्सी नोट पर काम नहीं किया)।

वहाँ GitHub

1

उपयोगी फ़ॉलबैक यहाँ पर एक साधारण काम कर कोड है: https://developer.mozilla.org/en-US/docs/Web/Events/MozOrientation

function orientationhandler(evt){ 


    // For FF3.6+ 
    if (!evt.gamma && !evt.beta) { 
    evt.gamma = -(evt.x * (180/Math.PI)); 
    evt.beta = -(evt.y * (180/Math.PI)); 
    } 

    // use evt.gamma, evt.beta, and evt.alpha 
    // according to dev.w3.org/geo/api/spec-source-orientation 


} 

window.addEventListener('deviceorientation', orientationhandler, false); 
window.addEventListener('MozOrientation',  orientationhandler, false); 
संबंधित मुद्दे