感應器的座標系統
通常情況,感應器架構使用標準的3軸座標系統來表達資料值。對於大多數感應器,座標系統是相對與裝置被保持在預設方向時的裝置的螢幕來定義的(1)。當裝置被保持在預設方向時,X軸是水平向右、Y軸是垂直向上、Z軸是指向螢幕面板的外部。在這個系統中,背對著螢幕的Z軸座標是負值。該座標系統被下列感應器使用:
1.加速度感應器
2.重力感應器
3.陀螺儀
4.線性加速感應器
5.磁力儀
圖1.感應器API使用的座標系統。
要理解的最重要的一點是,在裝置螢幕的方向發生變化時,座標系統的各座標軸不會發生變化,也就是說感應器的座標系統不會因裝置的移動而改變。這種行為與OpenGL座標系統的行為相同。
另外要理解的一點是,應用程式不要假設裝置的自然(預設)方向是縱向的。對於很多平板裝置的自然方向是橫向的。感應器座標系統總基於裝置的自然方向。
最後,如果你的應用程式要把感應器的資料跟螢幕上的顯示相匹配,那麼就要使用getRotation()方法來判斷螢幕的旋轉性,然後使用remapCoordinateSystem()方法把感應器座標映射到螢幕的座標上。即使在你的清單中指定了只是縱向顯示,你也要這麼做。
注意:有些感應器和方法使用的座標系統是相對與全球參照系(不是裝置參照系)。這些感應器和方法返回的資料是相對與地球的裝置運動或裝置位置。
訪問和使用感應器的最佳實務
在你設計你的感應器實現時,要確保遵循以下討論指南。這些指南是被推薦的使用感應器架構訪問感應器和擷取感應器資料的最佳實務。 www.2cto.com
登出感應器監聽器
在使用完成感應器或感應器的Activity被掛起時,要確保登出感應器的監聽器。如果被註冊的感應器監聽器和它的Activity被掛起,那麼感應器還會繼續擷取資料,並消耗電池資源直到登出感應器。下列代碼顯示如何使用onPause()方法來登出監聽器:
private SensorManager mSensorManager;
...
@Override
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this);
}
不要在模擬器上測試
因為模擬器不能夠類比感應器,所以目前還不能在模擬器上測試感應器代碼。你必須在物理裝置上測試你的感應器代碼。但是感應器模擬器能夠類比感應器的輸出。
不要阻塞onSensorChanged()方法
感應器資料能夠高頻率的變化,這意味著系統會非常頻繁的調用onSensorChanged(SensorEvent)方法。作為最佳實務,在onSensorChanged(SensorEvent)方法中應該儘可能的少做事,以便不阻塞這個方法。如果應用程式需要進行資料過濾或減少感應器資料,應該在onSensorChanged(SensorEvent)方法外來執行。
避免使用廢棄的方法或感應器類型
有幾個方法和常量已經被廢棄,尤其是TYPE_ORIENTATION感應器類型已經被廢棄。應該使用getOrientation()方法來擷取方向資料。同樣,TYPE_TEMPERATURE感應器類型也已經被廢棄了。在運行Android4.0的裝置上應用使用TYPE_AMBIENT_TEMPERATURE感應器類型來替代。
在使用之前要確認感應器
在嘗試從感應器上擷取資料之前,要始終確認你所使用的感應器在裝置上是否存在。不能因為是經常使用的感應器就簡單的假設感應器是存在的。不要求裝置製造商在他們的裝置上提供任何特定的感應器。
仔細選擇感應器的延遲
用registerListener()方法註冊感應器時,一定要選擇一個適應應用程式或應用情境的發送頻率。感應器能夠以很高的頻率來提供資料。允許系統在不浪費系統資源和不使用電池供電的情況下發送額外的資料。