Android:方向传感器

      说起方向传感器,笔者最近刚好用到,在这里记录一下。上网找了一下,关于方向传感器的文章大多数都已经使用已经过时的方法。有一些则是解析过度,看完之后还是不知道怎样使用新的Api。


1.旧的用法

首先sensorManager获得方向传感器:
Sensor sensor=sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
然后设置监听器:sensor.setOnSensorCanged();  //设置监听器的方法纯手打,并没有在编译器上试过,大概是这样写法,如果不是请以实际为准。。。原谅笔者的懒~~~

最后在onSensorChanged回调中通过SensorEvent的values数组得到传感器输出的值.
values[0]记录手机围绕Z轴的旋转角度。
values[1]记录手机围绕x轴旋转的角度。
values[2]记录手机围绕y轴的旋转角度。
我们只需获取z轴的数值就可以得知当前方法了~~
但是这已经被废弃的用法,不推荐这么写。
因为实际上获取手机旋转方向的角度是通过加速度传感器和地磁传感器共同计算的出的,所以我们的新的写法也是需要通过这两个传感器的数值计算出旋转角度。

2.新的用法


首先分别获取加速度传感器和地磁传感器的实例:


Sensor accelerometerSensor=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
Sensor magneticSensor=sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

可以看到获取传感器的方式与上面所说的一毛一样~然后注册监听器:
sensorManager.registerListener(listener,accelerometerSensor,SensorManager.SENSOR_DELAY_GAME);

sensorManager.registerListener(listener,maneticSensor,SensorManager.SENSOR_DELAY_GAME);
第一个参数是传入监听器对象,第二个传入要注册的传感器对象,第三个表示更新速率,这里使用了最高的更新速率

同样的在onSensorChanged()中可以获取到SensorEvent的values,如果使用同一个监听器注册两种传感器的话怎样区分开来呢?
可以通过event.sensor.getType判断当前的传感器类型。
    @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);
        SensorManager.getOrientation(R, values);
        degree = (float) Math.toDegrees(values[0]);
    

    }

将两个传感器的值传入到SensorManager.getRotationMatrix中,就可以得到一个包含旋转矩阵的R数组。
SensorManager.getRotationMatrix的计算结果会赋值到第一个参数中。第二个参数是一个用于将地磁向量转换成中立坐标的旋转矩阵,通常指定为null即可。第三和第四个分别就是及速度传感器和地磁传感器输出的值。
得到了R数组之后,接着就可以用SensorManager的getOrientation方法计算手机的旋转数据了。
通过把R数组传入到SensorManager的getOrientation的第一个参数,计算出的结果会赋值到第二个数组参数中。第二个参数是一个长度为3的float的数组,该数组中:
第一个数值:围绕Z轴旋转的旋转弧度。
第二个数值:围绕X轴的旋转弧度。
第三个数值:围绕Y轴的旋转弧度。

最后将围绕z轴旋转的弧度转化为角度:
 degree = (float) Math.toDegrees(values[0]);

















你可能感兴趣的:(Android)