轉:http://book.51cto.com/art/201411/457105.htm
《PhoneGap 3.0移動應用開發實戰詳解》本書對PhoneGap的相關知識進行介紹,共4個部分,31章。主要內容包括:PhoneGap的基本概念和開發環境的建立;原生插件的使用;軟件配置、GUI設計以及一些綜合性的開發案例;PhoneGap運行原理、自定義插件開發和第三方插件的使用。本節為大家介紹獲取設備手持方向——電子羅盤。
AD:
10.5 獲取設備手持方向——電子羅盤
很多手機都帶有電子羅盤傳感器,也被稱為電子指南針,就是根據地球的磁場來確定方向。
PhoneGap電子羅盤插件的完全限定名是org.apache.cordova.device-orientation,可以使用下面的命令安裝插件。
- phonegap plugin add org.apache.cordova.device-orientation
一旦安裝了插件,就可以使用該插件公開的API,它們都可以使用windows.navigator對象訪問。
通過PhoneGap插件公開的Compass類可以獲取羅盤傳感器的數據,從而獲知手機當前朝向,即設備的手持方向。
navigator.compass可以返回Compass類的一個實例,該類有以下三個方法:
compass.getCurrentHeading():獲取當前的朝向。
compass.watchHeading:設置監控,以特定時間間隔獲取朝向。
compass.clearWatch:清除監控設置。
語法格式如下:
- navigator.compass.getCurrentHeading(compassSuccess, compassError, compassOptions);
- var watchID = navigator.compass.watchHeading(compassSuccess, compassError, [compassOptions]);
- navigator.compass.clearWatch(watchID);
這三個方法與重力感應器的三個方法使用完全一致,只是成功回調函數會返回一個compassHeading對象,該對象包含了朝向信息。
例如下面的代碼,即演示了如何監控電子羅盤的朝向。
代碼內容Chapter_10-06
- var watchID = null;
- // 注冊deviceready事件監聽,指定deviceready事件處理函數
- document.addEventListener("deviceready", onDeviceReady, false);
- // deviceready事件處理函數,PhoneGap完成加載后調用該函數
- function onDeviceReady() {
- startWatch(); // 開始監控
- }
- // 開始監控
- function startWatch() {
- // 定義一個選項,傳遞給Compass.watchHeading()方法,表示每3秒更新一次
- var options = { frequency: 3000 };
- // 調用Compass.watchHeading()方法來持續獲取羅盤數據
- watchID = navigator.compass.watchHeading(onSuccess, onError,
- options);
- }
- // 停止監控
- function stopWatch() {
- if (watchID) {
- // 調用clearWatch()方法終止持續監控
- navigator.compass.clearWatch(watchID);
- watchID = null; // 賦值為null清空內存
- }
- }
- // 成功獲取當前羅盤數據后的回調函數
- function onSuccess(heading) {
- var element = document.getElementById('compassHeading');
- element.innerHTML = '當前朝向是 ' + heading.magneticHeading;
- }
- // 不能獲取當前羅盤數據后的回調函數
- function onError() {
- alert('onError!');
- }
時間間隔可以使用第三個參數compassOptions來設定。compassOptions是一個對象,該對象包含一個屬性frequency,用於以毫秒為單位指定間隔時間。
compassOptions還可以包含一個屬性filter,用於指定一個數字,只有變化超過這個數字才會觸發回調函數。目前只有iPhone支持該屬性。
1.失敗回調函數
監控方法的失敗回調函數有一個參數error。
- function onError(error) {
- navigator.notification.alert(error.code, null, 'Error!');
- }
Error中有一個名為code的屬性,該屬性值可以是如下常量之一,以分別表示出錯的原因:
CompassError.COMPASS_INTERNAL_ERR常量:表示內部錯誤。
CompassError.COMPASS_NOT_SUPPORTED常量:表示不支持。
2.compassHeading對象
監控方法的成功回調函數會返回一個compassHeading對象。
- 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返回的是相對於當前豎握或橫握的朝向值。
