傳感器的使用最有名的大概就是微信的搖一搖,和各種記步工具吧记靡,所以只要運用的好谈竿,傳感器也是一好的方向团驱。可以激發(fā)開發(fā)者的想象力:)空凸。
手機傳感器使用的前提當然是手機硬件的支持嚎花,例如我的手機就沒有溫度傳感器,所以用不了溫度類的app劫恒。
開發(fā)一個傳感器應(yīng)用比較簡單贩幻,一般可以分為三步:
- 調(diào)用
Context的getSystemService(Context.SENSOR_SERVICE)
方法獲取SensorManager對象。 - 調(diào)用SensorManager對象的getDefaultSensor()方法來獲取指定類型的傳感器
- 通常在onResume()中調(diào)用SensorManager對象的registerListener()方法為注冊傳感器两嘴。一般建議在onPause()反注冊
- 實現(xiàn)SensorEventListener接口就可以實現(xiàn)傳感器的監(jiān)聽丛楚。
按照上面的步驟,先獲得SensorManager對象
SensorManager mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
然后獲得Sensor對象:
Sensor mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ALL);
后面的參數(shù)是可以指定具體的傳感器類型憔辫,也可以指定所有的傳感器趣些,具體視情況而定。如果事先不知道手機是否支持我們所使用的傳感器贰您,可以通過判斷Sensor對象是否為空來決定不同的操作坏平,我曾經(jīng)下了一個溫度計,打開的時候它就提示我手機不支持然后強制退出了锦亦。所以以上的代碼可以改成:
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ALL);
if(mSensor != null){
//success
}else{
}
顯然后面不應(yīng)該傳入所有傳感器舶替,應(yīng)該是指定的。接著就是在onResume()和onPause()中注冊與反注冊傳感器:
@Override
protected void onResume() {
super.onResume();
//傳感器獲取事件的頻率
mSensorManager.registerListener(
this,
mSensor,
SensorManager.SENSOR_DELAY_UI);
}
@Override
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this, mSensor);
}
在注冊傳感器中有三個參數(shù):
listener:監(jiān)聽傳感器的監(jiān)聽器杠园,此處的Activity是實現(xiàn)了該接口顾瞪,所以傳入this;
sensor:傳感器對象抛蚁;
rate:獲取傳感器數(shù)據(jù)的頻率陈醒,一般支持如下的頻率值:
SensorManager. SENSOR_DELAY_FASTEST:這種頻率最快,慎用瞧甩,耗電
SensorManager. SENSOR_DELAY_GAME:由名字可知钉跷,適用于游戲。
SensorManager. SENSOR_DELAY_UI:適合普通用戶界面的頻率肚逸。模式省電爷辙,延遲較大,適合普通的小程序
SensorManager. SENSOR_DELAY_NORMAL:正常的頻率朦促,對實時性要求不是特別高的應(yīng)用適用
反注冊就是為了防止傳感器長期開著耗電犬钢,要及時關(guān)閉。
最后就是重寫方法:
@Override
public void onSensorChanged(SensorEvent event) {
//當數(shù)據(jù)發(fā)生變化的時候
if (event.sensor.getType() == Sensor.TYPE_ORIENTATION ){
float degree = -event.values[0];
RotateAnimation re = new RotateAnimation(
mStartDegree, degree, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f
);
//設(shè)置時間
re.setDuration(300);
mImageView.startAnimation(re);
mStartDegree = degree;
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
//TODO: 當傳感器精度發(fā)生變化的時候
}
上面event.values對象是一個float類型的數(shù)組思灰,一般有三個值,每個傳感器對應(yīng)這三個值的意義不同混滔,例如洒疚,加速度傳感器歹颓,values的三個值就是x,y,z方向上的加速度。而且當手機平躺的時候z方向有9.5左右的加速度油湖,簡直驚呆我巍扛。
再,傳感器的三個方向和屏幕的方向不一樣乏德,是長這樣的:
z方向是指向屏幕外
注意事項:
- 不要忘記注銷傳感器
- 不要在模擬器注冊你的代碼
- 不要阻塞onSensorChanged()方法:系統(tǒng)會比較頻繁的
- 避免使用過時的方法或傳感器類型
- 在使用前先驗證傳感器
- 謹慎選擇傳感器延遲時
就醬==撤奸。