美文网首页
Android 指南针

Android 指南针

作者: Wezarp | 来源:发表于2020-07-27 14:40 被阅读0次

    指南针

    关于指南针的实现,网上已经有很多的文章了,原理都一样,要使用Android系统的传感器实现,我们先简单看一下指南针的实现过程。

    指南针的实现

    1.传感器

    实现指南针需要的传感器可以分为两种,一种是屏幕方向传感器,但是已经被Google 标记为了 @Deprecated

    @Deprecated
     public static  final  int TYPE_ORIENTATION = 3;
    
    

    另一种比较新的方式,需要两个传感器配合,分别为加速度传感器和磁场传感器,我们主要说一下这种方式的实现。

     public static final int TYPE_ACCELEROMETER = 1;
    
     public static final int TYPE_MAGNETIC_FIELD=2;
    

    2.获取传感器

    首先我们需要获取到这两个传感器,记得做判空操作。

    sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
    

    3.订阅监听

    接下来订阅对这两个传感器的监听:

    sensorManager.registerListener(this,accelerometer,SensorManager.SENSOR_DELAY_NORMAL);
     
    sensorManager.registerListener(this,magneticField,SensorManager.SENSOR_DELAY_NORMAL);
    

    自定义监听实现接口:SensorEventListener ,这个接口有两个方法,分别是:

    public void onSensorChanged(SensorEvent event);
    
    public void onAccuracyChanged(Sensor sensor,intaccuracy);
    

    关于他们的作用,看一下接口里的注释,写的非常详细,顺便提一嘴,他们写的注释真是长,但是这真的是一个好习惯,对自己也是一个很好的提升的过程。

    4.数据处理

    最后就是对数据的处理了,通过用SDK中给出API对传感器返回数据的处理,就能获得当前的方向,这段代码我就直接贴出来吧,

    float[] R= new float[9];
     
    if(SensorManager.getRotationMatrix(R,null,accelerValues,magneticFieldValues)){
    
             float[] orientation =new float[3];
     
             SensorManager.getOrientation(R,orientation);
     
             float direction = (float) Math.toDegrees(orientation[0])*-1.0f;
     
     }else{
     
             Log.d("Compass","Error: SensorManager.getRotationMatrix");
     
     }
    

    到此为止,你就得到了指南针所需要的全部数据了,然后用这个数据去驱动一个Imageview + 动画,指南针就实现了。

    指南针的校准

    初步实现完了指南针,但是,转着转着,发现不准了角度,一看监听返回的数据也不准了,这时就需要来校准指南针了,具体的做法是什么呢,那就是拿手机画8,

    1

    那什么时候需要校准呢,怎么判断呢?这就用到上面监听返回的参数了accuracy

    @Override
    publicvoidonAccuracyChanged(Sensor sensor,intaccuracy){
     
          Log.d("TAG","onAccuracyChanged: :"+accuracy);
     
    }
    

    那么什么时候校验呢,看一下注释,分了5个级别,分别是:

    public static final int SENSOR_STATUS_NO_CONTACT=-1;
    
    public staticfinal int SENSOR_STATUS_UNRELIABLE=0;
     
    public static final int SENSOR_STATUS_ACCURACY_LOW=1;
     
    /**
     
         * This sensor is reporting data with an average level of accuracy,
     
         * calibration with the environment may improve the readings
     
         */
     
    public static final int SENSOR_STATUS_ACCURACY_MEDIUM=2;
     
     /** This sensor is reporting data with maximum accuracy */
     
    public static final int SENSOR_STATUS_ACCURACY_HIGH=3;
    

    那么我们就可以知道,精度小于3个都不可信

     if(accuracy>=SensorManager.SENSOR_STATUS_ACCURACY_HIGH){
     
             Log.e("Compass"," 不需要校验");
     
     }else{
     
             Log.e("Compass"," 需要校准 ");
     
     }
    

    至此,指南针的基本实现,校准的标准判断,就都有了,赶紧实现以下吧。

    相关文章

      网友评论

          本文标题:Android 指南针

          本文链接:https://www.haomeiwen.com/subject/yhyzlktx.html