移动端和桌面端最大的区别之一就是移动端硬件内置各种传感器,通过这些传感器可以开发很酷炫很实用的功能;以下是对常见的三种传感器的总结整理:
1:传感器的获取:
系统对于传感器的管理是统一的,都由SensorManger来管理;所以在使用某个传感器之前先要获取SensorManger实例,获取方法如下:
//获取传感器管理器,系统的所有传感器都是通过这个来管理的;
SensorManger smanger = (SensorManger)getSystemService(Context.SENSOR_SERVICE);
2:获取传感器对象:
传感器实例可以通过SensorManger实例的getDefaultSensor来获取:传入不同的传感器类型常量可以获取不同的传感器:
//通过getDefaultSensor()来获取任意传感器对象:
Sensor sensor = smanger.getDefaultSensor(Sensor.XXX);
3:传感器参数的监听:
传感器有测试精度,当精度发生变化的时候就会调用onAccuracyChanged()函数,使用传感器最多就是对传感器参数的监听,因此当传感器参数发生变化的时候就会调用onSensorChanged()函数:
SensorEventListener sensorEvent = new SensorEventListener(){
//当传感器精度发生变化的时候就会调用该方法
public void onAccuracyChanged(Sensor sensor,int accuracy){}
//当传感器的数字发生变化的时候就会调用这个方法
//event是个数组
public void onSensorChanged(SensorEvent event){
//比如:获取当前传感器参数
event.values[0]
}
}
4:注册:
传感器必须注册之后才能使用:
//第一个参数是传感器参数的监听实例,第二个是传感器对象,第三个是数据更新频率;有四个值可选;
smanger.registerListener(SensorEventListener sensorEvent,Sensor sensor,SENSOR_DELAY_UI);
5:解除注册:
资源有限,不能浪费;在传感器使用完毕或者应用程序关掉之后一定要释放资源:
smanger.unregisterListener(SensorEventListener sensorEvent)
6:光传感器的使用:
//下面获取光传感器,获取光传感器需要用Sensor.TYPE_LIGHT:
Sensor sensor = smanger.getDefaultSensor(Sensor.TYPE_LIGHT);
//在传感器参数变化监听中获取光照强度:
public void onSensorChanged(SensorEvent event){
//比如:获取当前传感器参数
event.values[0];
}
7:加速度传感器:
//获取光传感器;使用:Sensor.ACCELEROMETER
Sensor sensor = smanger.getDefaultSensor(Sensor.ACCELEROMETER);
//获取当前传感器参数,加速度传感器参数有三个:代表xyz轴:
event.values[0] //X
event.values[0] //y
event.values[0] //z
8:方向传感器:
第一种方式:
获取方向传感器实例:
//获取方向传感器
Sensor sensor = smanger.getDefaultSensor(Sensor.ORIENTATION);
获取方向传感器参数:
/获取当前传感器参数,方向传感器参数有三个:代表xyz轴:
event.values[0] //沿X的旋转角度
event.values[0] //沿y的旋转角度
event.values[0] //沿z的旋转角度
第二种方式:
第一种方式过于简单,参数也不是辣么准确,之后google提供了下面这种方式,获取精度较高,页是最为推荐的使用方式:
这种方式是通过加速度传感器和地磁传感器共同获取到的:
获取传感器管理对象:
SensorManger smanger = (SensorManger)getSystemService(Context.SENSOR_SERVICE);
获取传感器实例:
//通过getDefaultSensor()来加速度传感器对象:
Sensor sensorspeend = smanger.getDefaultSensor(Sensor.ACCELEROMETER);
//通过getDefaultSensor()来获取地磁传感器对象:
Sensor sensorci = smanger.getDefaultSensor(Sensor.MANGETIC_FILED);
注册传感器:
//加速度传感器注册:
smanger.registerListener(SensorEventListener sensorEvent,Sensor sensorspeend,SENSOR_DELAY_GAME);
//地磁传感器注册:
smanger.registerListener(SensorEventListener sensorEvent,Sensor sensorci,SENSOR_DELAY_GAME);
获取传感器参数
SensorEventListener sensorEvent = new SensorEventListener(){
//当传感器精度发生变化的时候就会调用该方法
public void onAccuracyChanged(Sensor sensor,int accuracy){
//暂时不做处理
}
/声明两个float数组,来存放地磁传感器和加速度传感器的参数;
float[] acc = new float[3];
float[] man = new float[3];
//当传感器的数字发生变化的时候就会调用这个方法
//event是个数组
public void onSensorChanged(SensorEvent event){
//获取当前传感器参数
if(sensor == Sensor.ACCELEROMETER){
//获取加速度传感器参数
acc = event.values.clone()
}else if(sensor == Sensor.MANGETIC_FILED){
//获取地磁传感器的参数
man = event.values.clone()
}
//用于存放R矩阵的数组
float[] R = new float[9];
//用于存放手机旋转最终结果的数组
float[] values = new float[3];
//获取R矩阵数据
getRotationMatrix(R,null,acc,man);
//获取具体的旋转数值;0,1,2下标分别代表x,y,z
smanger.getOritation(R,values);
//把数值转换为角度:
xDergree = Math.toDegrees(values[0]);
yDergree = Math.toDegrees(values[1]);
zDergree = Math.toDegrees(values[2]);
}
}