最近用知乎的時候著觉,偶然間發(fā)現(xiàn)搖一搖可以反饋問題,就想著做一個類似的功能惊暴,順便梳理下關于sensor的知識饼丘。
先看看做出來的效果:
傳感器中比較重要的幾個類:
android.hardware.Sensor;
android.hardware.SensorEvent
android.hardware.SensorEventListener
okay,會這幾個類就夠用了,再記住一個回調(diào)方法辽话,就能對付大多數(shù)的需求了
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent event) {
}
下面讓我回顧下傳感器的知識:
Android 中傳感器有很多肄鸽,當你打出[Sensor.]的時候就會看到下面這樣
下面還有好多,如果想詳細研究下所有傳感器可以看看這里 直達鏈接
Android的三大類傳感器
動作(Motion)傳感器油啤、環(huán)境(Environmental)傳感器典徘、位置(Position)傳感器
1.動作傳感器
加速(accelerometer)傳感器、重力(gravity)傳感器益咬、陀螺儀(gyroscope)傳感器逮诲、旋轉(zhuǎn)向量(rotational vector )傳感器
我們搖一搖功能主要用的就是動作傳感器中的加速傳感器,動作傳感器里有一個很吊的圖幽告,只要動作傳感器肯定涉及到坐標梅鹦,下圖形象的說明了這個坐標系。
在加速傳感器中:實現(xiàn)我上方說的那個回調(diào)
@Override
public void onSensorChanged(SensorEvent event) {
float[] values = event.values;
}
其中這三個值就代表著X,Y,Z方向的值
values[0]: Acceleration minus Gx on the x-axis
values[1]: Acceleration minus Gy on the y-axis
values[2]: Acceleration minus Gz on the z-axis
2.環(huán)境傳感器
濕度(barometer)傳感器冗锁、光線(photometer)傳感器齐唆、溫度(thermometer)傳感器
3.位置傳感器
方向(orientation)傳感器、磁力(magnetometer)傳感器
如何實現(xiàn)搖一搖反饋功能
1.顯示出手機中所有的傳感器
先獲取SensorManager對象
SensorManager sensorManager = (SensorManager).getSystemService(SENSOR_SERVICE);
列出來所有的傳感器
List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
為了實現(xiàn)搖一搖功能冻河,我寫了一個叫shakeUtils工具類并且實現(xiàn)了SensorEventListener箍邮,這樣我就需要實現(xiàn)下面兩個方法
/**
* 傳感器精度變化時回調(diào)
*/
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
/**
* 傳感器數(shù)據(jù)變化時回調(diào)
*/
@Override
public void onSensorChanged(SensorEvent event) {
int sensorType = event.sensor.getType();
float[] values = event.values;
if (sensorType == Sensor.TYPE_ACCELEROMETER) {
//這里可以調(diào)節(jié)搖一搖的靈敏度
if ((Math.abs(values[0]) > 12 || Math.abs(values[1]) > 12 || Math.abs(values[2]) > 12)) {
System.out.println("sensor value == " + " " + values[0] + " " + values[1] + " " + values[2]);
if (null != mOnShakeListener) {
mOnShakeListener.onShake();
}
}
}
if (sensorType == Sensor.TYPE_AMBIENT_TEMPERATURE) {
//todo
}
}
在主函數(shù)里主要這樣調(diào)用shakeUtils就行了:
shakeUtils = new ShakeUtils(this);
shakeUtils.setOnShakeListener(new ShakeUtils.OnShakeListener() {
@Override
public void onShake() {
Toast.makeText(MainActivity.this, "搖了搖", Toast.LENGTH_SHORT).show();
confirmDialog.setOnConfirmListener(new ConfirmDialog.OnConfirmClickListener() {
@Override
public void onFeedBack() {
gotoFeedBackActivity();
}
@Override
public void onScreenShot() {
saveScreenShoot(rootView);
}
});
confirmDialog.show();
}
});
}
有一點需要注意一下,我們SensorManager讓我們能拿到設備的sensors叨叙,但是當你不用sensors的時候锭弊,當你的activity處于pause的時候,sensor不會自動關閉的摔敛,這就會導致你的電池幾個小時就會將電耗盡廷蓉。例子里有一個
最后還是附上源碼,有需要的朋友可以拿去用马昙,直達鏈接桃犬。開源讓我們不斷進步。