ios獲取設備手持方向——電子羅盤


轉:http://book.51cto.com/art/201411/457105.htm

 

2014-11-15 19:07 張亞飛/崔巍 中國鐵道出版社 字號:T | T
 

《PhoneGap 3.0移動應用開發實戰詳解》本書對PhoneGap的相關知識進行介紹,共4個部分,31章。主要內容包括:PhoneGap的基本概念和開發環境的建立;原生插件的使用;軟件配置、GUI設計以及一些綜合性的開發案例;PhoneGap運行原理、自定義插件開發和第三方插件的使用。本節為大家介紹獲取設備手持方向——電子羅盤。

AD:

 

10.5  獲取設備手持方向——電子羅盤

很多手機都帶有電子羅盤傳感器,也被稱為電子指南針,就是根據地球的磁場來確定方向。

PhoneGap電子羅盤插件的完全限定名是org.apache.cordova.device-orientation,可以使用下面的命令安裝插件。
 

  1. phonegap plugin add org.apache.cordova.device-orientation 

一旦安裝了插件,就可以使用該插件公開的API,它們都可以使用windows.navigator對象訪問。

通過PhoneGap插件公開的Compass類可以獲取羅盤傳感器的數據,從而獲知手機當前朝向,即設備的手持方向。

navigator.compass可以返回Compass類的一個實例,該類有以下三個方法:

compass.getCurrentHeading():獲取當前的朝向。

compass.watchHeading:設置監控,以特定時間間隔獲取朝向。

compass.clearWatch:清除監控設置。

語法格式如下:
 

  1. navigator.compass.getCurrentHeading(compassSuccess, compassError, compassOptions);  
  2. var watchID = navigator.compass.watchHeading(compassSuccess, compassError, [compassOptions]);  
  3. navigator.compass.clearWatch(watchID); 

這三個方法與重力感應器的三個方法使用完全一致,只是成功回調函數會返回一個compassHeading對象,該對象包含了朝向信息。

例如下面的代碼,即演示了如何監控電子羅盤的朝向。

代碼內容Chapter_10-06
 

  1. var watchID = null;  
  2.  
  3. // 注冊deviceready事件監聽,指定deviceready事件處理函數  
  4. document.addEventListener("deviceready", onDeviceReady, false);  
  5. // deviceready事件處理函數,PhoneGap完成加載后調用該函數  
  6. function onDeviceReady() {  
  7.   startWatch(); // 開始監控  
  8. }  
  9.  
  10. // 開始監控  
  11. function startWatch() {  
  12.    // 定義一個選項,傳遞給Compass.watchHeading()方法,表示每3秒更新一次  
  13.    var options = { frequency: 3000 };  
  14.    // 調用Compass.watchHeading()方法來持續獲取羅盤數據  
  15.    watchID = navigator.compass.watchHeading(onSuccess, onError,  
  16.                                                     options);  
  17. }  
  18.  
  19. // 停止監控  
  20. function stopWatch() {  
  21.    if (watchID) {  
  22.       // 調用clearWatch()方法終止持續監控  
  23.       navigator.compass.clearWatch(watchID);  
  24.       watchID = null;                   // 賦值為null清空內存  
  25.    }  
  26. }  
  27.  
  28. // 成功獲取當前羅盤數據后的回調函數  
  29. function onSuccess(heading) {  
  30.    var element = document.getElementById('compassHeading');  
  31.    element.innerHTML = '當前朝向是 ' + heading.magneticHeading;  
  32. }  
  33.  
  34. // 不能獲取當前羅盤數據后的回調函數  
  35. function onError() {  
  36.    alert('onError!');  

時間間隔可以使用第三個參數compassOptions來設定。compassOptions是一個對象,該對象包含一個屬性frequency,用於以毫秒為單位指定間隔時間。

compassOptions還可以包含一個屬性filter,用於指定一個數字,只有變化超過這個數字才會觸發回調函數。目前只有iPhone支持該屬性。

1.失敗回調函數

監控方法的失敗回調函數有一個參數error。
 

  1. function onError(error) {  
  2.     navigator.notification.alert(error.code, null, 'Error!');  

Error中有一個名為code的屬性,該屬性值可以是如下常量之一,以分別表示出錯的原因:

CompassError.COMPASS_INTERNAL_ERR常量:表示內部錯誤。

CompassError.COMPASS_NOT_SUPPORTED常量:表示不支持。

2.compassHeading對象

監控方法的成功回調函數會返回一個compassHeading對象。
 

  1. function onSuccess(compassHeading) {  

該對象包含一個特殊時間點捕獲的朝向數據,它包含如下幾個屬性,如表10-2所示。

表10-2  compassHeading對象屬性

屬    性

功 能 描 述

magneticHeading

當前朝向,朝向是一個0~359.99的數字

trueHeading

相對於北極點的朝向,是一個0~359.99的數字。負值表示不能確定朝向

headingAccuracy

表示當前朝向與trueHeading之間的偏差

timestamp

以毫秒為單位的時間戳(DOM時間戳),表示捕捉到的時間

 

在Android環境下,其不支持trueHeading,與magneticHeading返回相同的值。headingAccuracy屬性將總是返回0,也就是說,magneticHeading和trueHeading之間沒有什么差別。

iOS注意事項

在iOS環境下,trueHeading僅在使用watchLocation()方法返回的compassHeading對象中才被支持。對於iOS 在4.0以上版本的設備中,如果設備旋轉,並且程序支持豎握或橫握,那么compassHeading返回的是相對於當前豎握或橫握的朝向值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM