传感器的简单介绍

一、传感器的使用。
  1.传感器使用步骤:
  ①.调用Context的getSystemService(Context.SERSOR_SERVICE)方法获取SensorManager对象。
  ②.调用SensorManager对象的getDefaultSensor(int type)方法来获取指定类型的传感器。
  ③.通常在Activity的onResume()方法中调用SensorManager的registerListener()为传感器注册监听。

  2. registerListener(SensorEventListener listener,Sensor sensor,int rate) 的参数说明:
    listener :监听传感器事件的监听器。需要实现SensorEventListener接口,并实现以下接口方法:
   public void onSensorChanged(SensorEvent event) :当传感器的值发生改变时触发。
   public void onAccuracyChanged(Sensor sensor, int accuracy):当传感器的精度发生改变时触发。
    sensor  :传感器对象。
    rate :指定获取传感器数据的频率。支持如下:
    ①SensorManager.SENSOR_DELAY_FASTEST:最快的频率,延迟最小,耗电量大,适合特别依赖传感器数据的应用。
    ②SensorManager.SENSOR_DELAY_GAME :适合游戏的频率。适合一般实时性要求的应用。
    ③SensorManager.SENSOR_DELAY_NORMAL:正常频率。适合实时性要求不是特别高的应用。
    ④SensorManager.SENSOR_DELAY_UI:最小的频率,延迟较大,耗电量小,系统开销小,适合普通用户界面的频率。

  3.常用传感器:
    传感器的坐标与屏幕的坐标系统不同,传感器系统的X轴沿屏幕向左,Y轴沿屏幕向上,Z轴垂直于屏幕向里。
   ①加速度传感器:type=Sensor.TYPE_ACCELEROMETER,SensorEvent 的values()方法返回X、Y、Z方向上的加速度。
   ②方向传感器:
  /**
  * 需要通过加速度传感器得到三个加速度的值
  */
 private float[] aValues = new float[3];
 /**
  *需要通过磁场传感器得到三个方向的值
  */
 private float[] mValues = new float[3];
/**
*SensorManager.getRotationMatrix将值传给R[9]
*/
 float [] R=new float [9]; 
/**
*   SensorManager.getOrientation(R, values)将值传给values[3]
*/
  float [] values=new float [3];
 /**
*R和I是长度为9的float数组,可以为null。
*aValues是长度为3的float数组,值为加速度传感器返回的三个值
*mValues是长度为3的float数组,值为磁场传感器返回的三个值。
* 返回值:成功为true。
*/
  boolean flag=SensorManager.getRotationMatrix(R, I, aValues, mValues);
  // 将三个方向的值传给values数组
  SensorManager.getOrientation(R, values);
//得到的值为弧度,转化为角度
  values[0]=(float) Math.toDegrees(values[0]);
  values[0]:Z轴角度,表示手机顶部与正北方向的夹角。角度为0时,代表手机顶部朝正北,角度为90,代表朝正东
  values[1]:X周角度,表示手机顶部或尾部翘起的角度。范围-180~180。从顶部抬起,角度减少。
  values[2]:Y轴角度,表示手机左侧或右侧翘起的角度。范围-90~90。从左侧抬起,角度减少。
  
 ③温度传感器:type=Sensor.TYPE_AMBIENT_TEMPERATURE,返回一个值,单位摄氏度。
 ④光传感器:type=Sensor.TYPE_LIGHT,返回一个值,单位lux。
 ⑤压力传感器:type=Sensor.TYPE_PRESSURE,返回一个值。

 4.方向传感器的示例:
   
public class MainActivity extends Activity {
 private TextView show;
 /**
  * 传感器管理对象
  */
 private SensorManager sensorManager;
 /**
  * 监听器对象
  */
 private MySensorListener listener;
 /**
  * 加速度传感器
  */
 private Sensor aSensor;
 /**
  * 磁场传感器
  */
 private Sensor mSensor;
 /**
  * 加速度传感器的值
  */
 private float[] aValues = new float[3];
 /**
  * 磁场度传感器的值
  */
 private float[] mValues = new float[3];
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  show = (TextView) findViewById(R.id.tv_show);
  // 获取传感器管理者对象
  sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
  // 获取加速度传感器
  aSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
  // 获取磁场传感器
  mSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
 
  listener=new MySensorListener();
  //注册监听器
  sensorManager.registerListener(listener, aSensor, SensorManager.SENSOR_DELAY_NORMAL);
  sensorManager.registerListener(listener, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
  showText();
 }
 /**
  * 传感器监听器类
  *
  */
 class MySensorListener implements SensorEventListener {
  /**
   * 当传感器的值发生改变时触发该方法
   */
  @Override
  public void onSensorChanged(SensorEvent event) {
   switch (event.sensor.getType()) {
   case Sensor.TYPE_ACCELEROMETER:
    aValues = event.values;
    break;
   case Sensor.TYPE_MAGNETIC_FIELD:
    mValues = event.values;
    break;
   }
   showText();
  }
  /**
   * 当传感器的精度发生改变时触发该方法
   */
  @Override
  public void onAccuracyChanged(Sensor sensor, int accuracy) {
  }
 }
 @Override
 protected void onStop() {
  // 取消监听器的注册
  if (listener != null) {
   sensorManager.unregisterListener(listener, aSensor);
   sensorManager.unregisterListener(listener, mSensor);
   listener = null;
  }
  super.onStop();
 }
 public void showText() {
  float [] R=new float [9];
  float [] values=new float [3];
  // R和I是长度为9的数组,可以为null,aValues是长度为三的数组,值为加度素传感器返回的三个值,mValues是长度为三的数组,值为磁场传感器返回的三个之
  boolean flag=SensorManager.getRotationMatrix(R, null, aValues, mValues);
  System.out.println(flag);
  // 将三个方向的值传给values数组
  SensorManager.getOrientation(R, values);
        //将弧度转化为角度
  values[0]=(float) Math.toDegrees(values[0]);
  values[1]=(float) Math.toDegrees(values[1]);
  values[2]=(float) Math.toDegrees(values[2]);
  StringBuffer sb = new StringBuffer();
  sb.append("绕Z轴的角度:" + values[0]);
  sb.append("\n绕X轴的角度:" + values[1]);
  sb.append("\n绕Y轴的角度:" + values[2]);
  show.setText(sb.toString());
 }
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值