第十二讲 传感器
光照传感器、加速度传感器、地磁传感器、压力传感器、温度传感器等。
SensorManger senserManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
SensorManager 是系统所有传感器的管理器
Sensor sensor = senserManager.getDefaultSensor(Sensor.TYPE_LIGHT);
传感器输出的信号进行监听,这就要借助
SensorEventListener 来实现 了。
SensorEventListener 是一个接口,其中定义了 onSensorChanged()和 onAccuracyChanged() 这两个方法,
如下所示:
SensorEventListener listener = new SensorEventListener() {
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent event) {
float values=event.values[0]; 获取当前光照的强度
}
};
sensorManager.registerListener(listener,senser,SensorManager.SENSOR_DELAY_NORMAL);
sensorManager.unregisterListener(listener);
由于地心引力的存在,你的手机无论在世界上任何角落都会有一个重力 加速度,这个加速度的值大约是 9.8m/s2。当手机平放的时候,这个加速度是作用在 Z 轴上 的,当手机竖立起来的时候,这个加速度是作用在 Y 轴上的,当手机横立起来的时候,这个 加速度是作用在 X 轴上的。
onSensorChanged(SensorEvent event)
float xValue=Math.abs(event.values[0]);
float yValue=Math.abs(event.values[1]);
float zValue = Math.abs(event.values[2]);
if (xValue > 15 || yValue > 15 || zValue > 15) {
// 认为用户摇动了手机,触发摇一摇逻辑
Toast.makeText(MainActivity.this, “摇一摇”, Toast.LENGTH_SHORT).show();
事实上,Android 获取手 机旋转的方向和角度是通过加速度传感器和地磁传感器共同计算得出的,这也是 Android 目 前推荐使用的方式。
其实指南针的实现原理并不复杂,我们只需要检测到手机围绕 Z 轴的旋转角度,然后 对这个值进行处理就可以了。
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
// 注意赋值时要调用clone()方法
accelerometerValues = event.values.clone();
} else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
// 注意赋值时要调用clone()方法
magneticValues = event.values.clone();
}
float[] R = new float[9];
float[] values = new float[3];
SensorManager.getRotationMatrix(R, null, accelerometerValues,
magneticValues);
SensorManager.getOrientation(R, values);
Log.d(“MainActivity”, “value[0] is ” + Math.toDegrees(values[0])); }
就将 values 数组赋值给 accelerometerValues 数组
accelerometervalues=event.values.clone();
SensorManager.getRotationMatrix(R.null,accelerometerValues,magneticValues); 为R赋值
SensorManager.getOrientation(R, values); 为values赋值
values[0]表示手机围绕 Z 轴旋转 的弧度,这里我们调用 Math.toDegrees()方法将它转换成角度,并打印出来。
float rotateDegree =-(float) Math.toDegrees(values[0]);
if (Math.abs(rotateDegree - lastRotateDegree) > 1) {
RotateAnimation animation = new RotateAnimation (lastRotateDegree, rotateDegree, Animation.RELATIVE_TO_SELF, 0.5f, Animation. RELATIVE_TO_SELF, 0.5f);
animation.setFillAfter(true);
compassImg.startAnimation(animation);
lastRotateDegree = rotateDegree;