传感器
手机的传感器的调用都是大同小异的,可谓是一通百通,步骤如下:
1)获得传感器管理器:
SensorManager manager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
有了这个传感器的实例就可以获得各种传感器的实例了。
2)获得传感器的实例:
Sensor sensor = manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);//获得的是加速度传感器
3)对传感器的信号进行监听:
private SensorEventListener listener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
在监视器中有两个方法:onSensorChanged(),onAccuracyChanged();onSensorChanged()方法是在传感器的测量数值发生变化的时候调用,onAccuracyChanged()是传感器的精度发生变化的时候调用。event的value数组中就存放着测量的数据。
4)在onCreat()中注册传感器:manager.registerListener(listener,sensor,SensorManager.SENSOR_DELAY_NORMAL);
第一个参数为:SensorEventListener的对象,第二个参数为:传感器的实例,第三个参数为:传感器的数据更新数据的速率。
5)在onDestroy()中注销注册:manager.unregisterListener(listener);
具体传感器的说明
具体的步骤就是这样,但是具体的传感器有不同的特质,尤其是测得的数值在values数组中是如何摆列的:
1)光照传感器:光照强度在event.values[0]
2)加速度传感器(Sensor.TYPE_ACCELEROMETER):values数组的值分别代表 x,y,Z的加速度。
3)手机获得旋转的角度和方向是通过加速度传感器与地磁传感器共同计算的。
代码如下:
private SensorEventListener listener = new SensorEventListener() {
float [] accelerometerValues = new float[3];
float [] magneticValues = new float[3];
@Override
public void onSensorChanged(SensorEvent event) {
if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){
accelerometerValues = event.values.clone();
}else if(event.sensor.getType()==Sensor.TYPE_MAGNETIC_FIELD){
magneticValues = event.values.clone();
}
float [] R = new float[9];
float [] values = new float[3];
SensorManager.getRotationMatrix(R,null,accelerometerValues,magneticValues);//对R数组赋值,
SensorManager.getOrientation(R,values);//对values进行赋值。
//values数组中的值分别是Z,X,Y轴的旋转弧度
float rotateDegress = (float) -Math.toDegrees(values[0]);
if(Math.abs(rotateDegress - lastRotateDegress)>4){
// RotateAnimation animation = new RotateAnimation(lastRotateDegress,rotateDegress, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
// animation.setFillAfter(true);
// compass.startAnimation(animation);
// lastRotateDegress=rotateDegress;
compass.setDegress(rotateDegress );
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
注意;Math.toDegrees(values[0]);//将弧度转化为度。