今天面試情龄,突然有需求是通過記錄步數(shù)來達(dá)到領(lǐng)取優(yōu)惠劵的目的(計(jì)步傳感器),頓時(shí)我就懵比了捍壤,雖然會(huì)點(diǎn)骤视,之前項(xiàng)目中很少用到。我現(xiàn)在就帶領(lǐng)大家了解了解白群,有不對(duì)的地方多多指教尚胞。
記住在學(xué)習(xí)中硬霍,難免會(huì)碰到一些困難帜慢,給我們帶來煩惱。成績(jī)較差唯卖,雖然自己努力了粱玲,卻總不見效;練習(xí)立定跳遠(yuǎn)拜轨,卻總是跳不過那根優(yōu)秀線……這樣的例子有很多抽减。當(dāng)我們遇到這些困難時(shí),該擁用怎樣的心態(tài)橄碾?我們“班務(wù)欄”里“班級(jí)目標(biāo)”后寫著一句話:“每天進(jìn)步一點(diǎn)”卵沉。我們就是要抱著這種良好的心態(tài),努力學(xué)習(xí)法牲,爭(zhēng)取每天進(jìn)步一點(diǎn)史汗。
傳感器的使用
1.加速度傳感器
2.磁場(chǎng)傳感器
3.方向傳感器
4.陀螺儀傳感器
5.重力傳感器
6.線性加速度傳感器
7.溫度傳感器
8.光線傳感器
9.距離傳感器
10.壓力傳感器
11.計(jì)步傳感器
1. 首先先查看測(cè)試的安卓機(jī)擁有的傳感器
這里先初始化一個(gè)SensorManager的對(duì)象,然后把所有支持的sensor類型log日志打印出來看看拒垃。
SensorManager mSensorManager;
List<Sensor> sensorList;
// 實(shí)例化傳感器管理者
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
// 得到設(shè)置支持的所有傳感器的List
sensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL);
List<String> sensorNameList = new ArrayList<String>();
for (Sensor sensor : sensorList) {
Log.d(TAG, "onResume: "+sensor.getName());
}
下面為大家一一介紹
1.加速度傳感器
在這這之前先了解一下手機(jī)傳感器世界的三維坐標(biāo)
首先先創(chuàng)建3個(gè)textView來顯示三個(gè)方向上的加速度停撞。
先給Activity實(shí)現(xiàn)SensorEventListener接口,后面要不斷要監(jiān)聽來刷新數(shù)據(jù)
public class MainActivity extends AppCompatActivity implements
SensorEventListener {
然后創(chuàng)建SensorManager對(duì)象悼瓮,如果前面設(shè)置過就不用設(shè)置戈毒,然后為它注冊(cè)加速度傳感器監(jiān)
聽器,采樣頻率可以自己設(shè)置横堡,一般越高越精準(zhǔn)但是越耗電
private SensorManager sm;
//創(chuàng)建一個(gè)SensorManager來獲取系統(tǒng)的傳感器服務(wù)
sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
/*
* 最常用的一個(gè)方法 注冊(cè)事件
* 參數(shù)1 :SensorEventListener監(jiān)聽器
* 參數(shù)2 :Sensor 一個(gè)服務(wù)可能有多個(gè)Sensor實(shí)現(xiàn)埋市,此處調(diào)用getDefaultSensor獲取默認(rèn)的
Sensor
* 參數(shù)3 :模式 可選數(shù)據(jù)變化的刷新頻率,多少微秒取一次命贴。
* */
//加速度傳感器
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL);
接下來我們只要監(jiān)聽這個(gè)傳感器值的變化道宅,然后更新textView的值就好了
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
float X_lateral = sensorEvent.values[0];
float Y_longitudinal = sensorEvent.values[1];
float Z_vertical = sensorEvent.values[2];
mtextViewx.setText(X_lateral + "");
mtextViewy.setText(Y_longitudinal + "");
mtextViewz.setText(Z_vertical + "");
}
}
結(jié)果:可以看到放在桌子上的時(shí)候x和y軸的加速度幾乎為0腊满,我手機(jī)不太平,而z軸的加速度接近9.8
在activity變?yōu)椴豢梢姷臅r(shí)候培己,傳感器依然在工作碳蛋,這樣很耗電,所以我們根據(jù)需求可以在onPause方法里面停掉傳感器的工作
@Override
public void onPause() {
sm.unregisterListener(this);
super.onPause();
}
2.磁場(chǎng)傳感器
和加速度計(jì)一樣省咨,為sensormanager監(jiān)聽磁場(chǎng)變化即可肃弟,吧手機(jī)放在電腦旁邊時(shí)候可以清楚看到數(shù)值的變化
// 為磁場(chǎng)傳感器注冊(cè)監(jiān)聽器
sm.registerListener(this,
sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
SensorManager.SENSOR_DELAY_NORMAL);
else if(sensorEvent.sensor.getType() ==
Sensor.TYPE_MAGNETIC_FIELD){
float X_lateral = sensorEvent.values[0];
float Y_longitudinal = sensorEvent.values[1];
float Z_vertical = sensorEvent.values[2];
mtextView1.setText("x軸的磁場(chǎng)強(qiáng)度\n"+ X_lateral );
mtextView2.setText("y軸的磁場(chǎng)強(qiáng)度\n"+ Y_longitudinal );
mtextView3.setText("z軸的磁場(chǎng)強(qiáng)度\n"+ Z_vertical );
}
3.方向傳感器
這個(gè)可以用來做指南針之類的,繞z軸轉(zhuǎn)過的角度為0時(shí)大概指向正北零蓉。這個(gè)TYPE_ORIENTATION接口不夠精確已經(jīng)過時(shí)了笤受,可以使用旋轉(zhuǎn)矩陣來代替。這里繞z軸轉(zhuǎn)過的角度是value[0],
詳情看這個(gè)博客點(diǎn)擊打開鏈接
// 為方向傳感器注冊(cè)監(jiān)聽器
sm.registerListener(this,
sm.getDefaultSensor(Sensor.TYPE_ORIENTATION),
SensorManager.SENSOR_DELAY_NORMAL);
else if(sensorEvent.sensor.getType() ==
Sensor.TYPE_ORIENTATION){
float X_lateral = sensorEvent.values[0];
float Y_longitudinal = sensorEvent.values[1];
float Z_vertical = sensorEvent.values[2];
mtextView4.setText("繞z軸轉(zhuǎn)過的角度\n"+ X_lateral );
mtextView5.setText("繞x軸轉(zhuǎn)過的角度\n"+ Y_longitudinal );
mtextView6.setText("繞y軸轉(zhuǎn)過的角度\n"+ Z_vertical );
}
4.陀螺儀傳感器
// 為陀螺儀傳感器注冊(cè)監(jiān)聽器
sm.registerListener(this,
sm.getDefaultSensor(Sensor.TYPE_GYROSCOPE),
SensorManager.SENSOR_DELAY_NORMAL);
else if(sensorEvent.sensor.getType() ==
Sensor.TYPE_GYROSCOPE){
//需要將弧度轉(zhuǎn)為角度
float X = (float)Math.toDegrees(sensorEvent.values[0]);
float Y = (float)Math.toDegrees(sensorEvent.values[1]);
float Z = (float)Math.toDegrees(sensorEvent.values[2]);
mtextView7.setText("繞x軸轉(zhuǎn)過的角速度\n"+ X );
mtextView8.setText("繞y軸轉(zhuǎn)過的角速度\n"+ Y );
mtextView9.setText("繞z軸轉(zhuǎn)過的角速度\n"+ Z );
5.重力傳感器
就是把重力加速度分解到xyz三個(gè)方向上
// 為重力傳感器注冊(cè)監(jiān)聽器
sm.registerListener(this,
sm.getDefaultSensor(Sensor.TYPE_GRAVITY),
SensorManager.SENSOR_DELAY_NORMAL);
else if(sensorEvent.sensor.getType() == Sensor.TYPE_GRAVITY){
float X = sensorEvent.values[0];
float Y = sensorEvent.values[1];
float Z = sensorEvent.values[2];
mtextViewgx.setText("x方向的重力加速度\n"+ X );
mtextViewgy.setText("Y方向的重力加速度\n"+ Y );
mtextViewgz.setText("Z方向的重力加速度\n"+ Z );
6.線性加速度傳感器
就是去掉重力加速度后各個(gè)方向的加速度
// 為線性加速度傳感器注冊(cè)監(jiān)聽器
sm.registerListener(this,
sm.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION),
SensorManager.SENSOR_DELAY_NORMAL);
else if(sensorEvent.sensor.getType() ==
Sensor.TYPE_LINEAR_ACCELERATION){
float X = sensorEvent.values[0];
float Y = sensorEvent.values[1];
float Z = sensorEvent.values[2];
mtextViewlx.setText("x方向的線性加速度\n"+ X );
mtextViewly.setText("Y方向的線性加速度\n"+ Y );
mtextViewlz.setText("Z方向的線性加速度\n"+ Z );
}