最近用知乎的时候,偶然间发现摇一摇可以反馈问题,就想着做一个类似的功能,顺便梳理下关于sensor的知识。
先看看做出来的效果:
传感器中比较重要的几个类:
android.hardware.Sensor;
android.hardware.SensorEvent
android.hardware.SensorEventListener
okay,会这几个类就够用了,再记住一个回调方法,就能对付大多数的需求了
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent event) {
}
下面让我回顾下传感器的知识:
Android 中传感器有很多,当你打出[Sensor.]的时候就会看到下面这样
下面还有好多,如果想详细研究下所有传感器可以看看这里 直达链接
Android的三大类传感器
动作(Motion)传感器、环境(Environmental)传感器、位置(Position)传感器
1.动作传感器
加速(accelerometer)传感器、重力(gravity)传感器、陀螺仪(gyroscope)传感器、旋转向量(rotational vector )传感器
我们摇一摇功能主要用的就是动作传感器中的加速传感器,动作传感器里有一个很吊的图,只要动作传感器肯定涉及到坐标,下图形象的说明了这个坐标系。
在加速传感器中:实现我上方说的那个回调
@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.环境传感器
湿度(barometer)传感器、光线(photometer)传感器、温度(thermometer)传感器
3.位置传感器
方向(orientation)传感器、磁力(magnetometer)传感器
如何实现摇一摇反馈功能
1.显示出手机中所有的传感器
先获取SensorManager对象
SensorManager sensorManager = (SensorManager).getSystemService(SENSOR_SERVICE);
列出来所有的传感器
List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
为了实现摇一摇功能,我写了一个叫shakeUtils工具类并且实现了SensorEventListener,这样我就需要实现下面两个方法
/**
* 传感器精度变化时回调
*/
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
/**
* 传感器数据变化时回调
*/
@Override
public void onSensorChanged(SensorEvent event) {
int sensorType = event.sensor.getType();
float[] values = event.values;
if (sensorType == Sensor.TYPE_ACCELEROMETER) {
//这里可以调节摇一摇的灵敏度
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
}
}
在主函数里主要这样调用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不会自动关闭的,这就会导致你的电池几个小时就会将电耗尽。例子里有一个
最后还是附上源码,有需要的朋友可以拿去用,直达链接。开源让我们不断进步。