指南针

关于指南针的实现,网上已经有很多的文章了,简单搜一下都能看懂,原理都一样,要使用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, int accuracy);

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

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,

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

 @Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {Log.d("TAG", "onAccuracyChanged: :" +accuracy);}

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

public static final int SENSOR_STATUS_NO_CONTACT = -1;
public static final 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 指南针校正相关推荐

  1. android指南针功能,轻松实现Android指南针功能

    本文实例为大家讲解如何轻松实现Android指南针功能,分享给大家供大家参考.具体如下: (1)布局文件如下: android:layout_width="fill_parent" ...

  2. android 指南针传感器,android 传感器使用 Compass指南针的实现功能

    以下是指南针通过方向传感器而旋转实现. CompassDemo.java: package com.example.activity;import android.app.Activity;impor ...

  3. android指南针校准 代码_Android指南针app的实现原理总结

    要想实现指南针功能,其实主要就是获取手机的方位,通过对比前一刻方位和现在手机方位算出手机旋转的角度,然后根据手机实际旋转的角度去旋转指南针的imageview.关键在于如何获取手机实际方位. 那么如何 ...

  4. android指南针校准 代码_android 指南针app源码(亲测可用)

    [实例简介] [实例截图] [核心代码] package cn.icast.zhinanzhen; import android.app.Activity; import android.conten ...

  5. android 指南针不稳定,Android指南针方向不可靠(低通滤波器)

    虽然我没有在Android上使用指南针,但下面显示的基本处理(在JavaScript中)可能适用于您. 它基于加速度计上的低通滤波器,它是由Windows Phone team推荐的,适用于罗盘(每3 ...

  6. Android指南针代码示例

    今天,我将分享一个有效的代码,为您的android设备制作一个非常简单的罗盘应用程序. 某些android设备(例如Huawei Y300和Lenovo P700i)不完全支持运动传感器,因此该代码不 ...

  7. Android指南针陀螺仪开发

    Android完整指南针demo,主要两个类,一个指南针旋转动画类,一个指南针界面类 先上效果图,如下 1.动画类 2.界面类 以上代码有参考网络上的文章,确实太久远,找不到出处了,还请大神们见谅. ...

  8. arcgis android 指南针,Arcgis runtime for Android 100.5 (六) 自定义指南针

    Arcgis没有提供指南针控件,如果需要,可以自定义一个,很简单 去阿里图标库下载一个能用的指南针如 指南针 放置在布局文件中 xmlns:fab="http://schemas.andro ...

  9. Android指南针应用

    目的:通过指南针应用来学习SensorManager.LocationManger的使用以及对android 6.0动态权限的适配 一.通过android的方向传感器获取手机方位 通过对比前一刻方位和 ...

  10. Android 指南针

    开发指南针思路很简单:准备一张指南针图片,该图片上方向指针指向北方.接下来开发一个检测方向的传感器,程序检测到手机顶部绕Z轴转过多少度,让指南针图片反向转过多少度即可. 程序代码: package o ...

最新文章

  1. windows 下使用composer
  2. C#开发ActiveX网页截图控件
  3. Android自带的图标集合
  4. 风控建模 python 知乎_风控建模基本要求及面试问题小结
  5. 马斯克又开始了,喋喋不休,吊足大家胃口
  6. 【clickhouse】clickhouse 漫谈SIMD、SSE指令集与ClickHouse向量化执行
  7. python字典有序还是无序_python--基础语法
  8. 二级C语言考试环境注意事项
  9. PS的30个实用技巧大全
  10. 监控摄像机镜头角度和距离计算表
  11. Codeforces718 C. Sasha and Array(线段树维护矩阵,矩阵快速幂求斐波那契数列,矩阵乘法结合律)
  12. 指纹识别技术未来发展趋势
  13. Python面向对象编程——类的学习
  14. 华为智慧屏 SE55
  15. 排序方法基本介绍(1)
  16. 微信小程序开发——上课摇号系统的开发
  17. Kettle 3.2 连接 SQL Server 2008
  18. 散文说python半篇——景观三元论与盖茨比的对话
  19. 2022年中国第三方支付市场专题分析
  20. WIN10系统下提示文件被另外一个程序打开无法重命名、删除、移动的解决方法

热门文章

  1. 【杂七杂八】虚拟机win中 腾讯会议视频黑屏
  2. win10计算机磁盘图标,主编教你win10系统无法正常显示硬盘图标的方法
  3. java GUI程序的编写入门
  4. HDU 3533 Escape (预处理+BFS)
  5. wincc 写入mysql,WINCC读写SQL数据库的示例
  6. c语言两矩阵相乘算法,用c语言实现两个矩阵相乘怎么做?
  7. pycharm界面代码区域无法编辑的解决方法
  8. cdn刷新api_【第1868期】闲话 CDN
  9. java求闰年_Java判断闰年的2种方法示例
  10. IOS 设备越狱原理