其实这篇博客不是做真正的指南针,因为真正的指南针需要做一个完整的自定义控件来指示方向。我们这里只是简单通过代码获取用户手机头部指向的方向。这个功能往往在我们定位获取的时候,用户方向变更后进行采集、车辆行驶偏移等有一定的作用。下面我们通过代码简单编写一下。

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><TextViewandroid:id="@+id/tv_direction"android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="5dp"android:text="指南针找方向来啦"android:textColor="@color/black"android:textSize="17sp" /><TextViewandroid:id="@+id/tv_jt"android:layout_width="60dp"android:layout_height="60dp"android:text="↑"android:textSize="30dp"android:textColor="#333333"android:gravity="center"android:layout_gravity="center_horizontal"/>
</LinearLayout>

MainActivity.java

public class MainActivity extends BaseActivityimplements SensorEventListener {private TextView tv_direction;private SensorManager mSensorMgr;// 声明一个传感管理器对象private float[] mAcceValues; // 加速度变更值的数组private float[] mMagnValues; // 磁场强度变更值的数组private TextView tv_jt;@Overrideprotected MvcBaseModel getModelImp() {return null;}@Overrideprotected int getContentLayoutId() {return R.layout.activity_main;}@Overrideprotected void initWidget() {tv_direction = findViewById(R.id.tv_direction);tv_jt = findViewById(R.id.tv_jt);// 从系统服务中获取传感管理器对象mSensorMgr = (SensorManager) getSystemService(Context.SENSOR_SERVICE);}@Overrideprotected void onPause() {super.onPause();// 注销当前活动的传感监听器mSensorMgr.unregisterListener(this);}@Overrideprotected void onResume() {super.onResume();int suitable = 0;// 获取当前设备支持的传感器列表List<Sensor> sensorList = mSensorMgr.getSensorList(Sensor.TYPE_ALL);for (Sensor sensor : sensorList) {if (sensor.getType() == Sensor.TYPE_ACCELEROMETER) { // 找到加速度传感器suitable += 1;} else if (sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { // 找到磁场传感器suitable += 10;}}if (suitable / 10 > 0 && suitable % 10 > 0) {// 给加速度传感器注册传感监听器mSensorMgr.registerListener(this,mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_NORMAL);// 给磁场传感器注册传感监听器mSensorMgr.registerListener(this,mSensorMgr.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),SensorManager.SENSOR_DELAY_NORMAL);} else {tv_direction.setText("当前设备不支持指南针,请检查是否存在加速度和磁场传感器");}}@Overridepublic void onSensorChanged(SensorEvent event) {if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { // 加速度变更事件mAcceValues = event.values;} else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { // 磁场强度变更事件mMagnValues = event.values;}if (mAcceValues != null && mMagnValues != null) {calculateOrientation(); // 加速度和磁场强度两个都有了,才能计算磁极的方向}}//当传感器精度改变时回调该方法,一般无需处理public void onAccuracyChanged(Sensor sensor, int accuracy) {}// 计算指南针的方向private void calculateOrientation() {float[] values = new float[3];float[] R = new float[9];SensorManager.getRotationMatrix(R, null, mAcceValues, mMagnValues);SensorManager.getOrientation(R, values);values[0] = (float) Math.toDegrees(values[0]);Log.i("aaaaaaaaaaa",values[0]+"");tv_jt.setRotation(values[0]);// 设置罗盘视图中的指南针方向if (values[0] >= -10 && values[0] < 10) {tv_direction.setText("手机上部方向是正北");} else if (values[0] >= 10 && values[0] < 80) {tv_direction.setText("手机上部方向是东北");} else if (values[0] >= 80 && values[0] <= 100) {tv_direction.setText("手机上部方向是正东");} else if (values[0] >= 100 && values[0] < 170) {tv_direction.setText("手机上部方向是东南");} else if ((values[0] >= 170 && values[0] <= 180)|| (values[0]) >= -180 && values[0] < -170) {tv_direction.setText("手机上部方向是正南");} else if (values[0] >= -170 && values[0] < -100) {tv_direction.setText("手机上部方向是西南");} else if (values[0] >= -100 && values[0] < -80) {tv_direction.setText("手机上部方向是正西");} else if (values[0] >= -80 && values[0] < -10) {tv_direction.setText("手机上部方向是西北");}}
}

这样就实现了方向的获取和配合指针的一个旋转。如果大家需要可以在UI上进行相应的变化。

Android中指南针的实现相关推荐

  1. 【Android App】物联网中指南针、计步器、感光器、陀螺仪的讲解及实战演示(附源码 超详细必看)

    需要源码请点赞关注收藏后评论区留言~~~ 一.指南针-磁场传感器 顾名思义,指南针只要找到朝南的方向就好了. 可是在App中并非使用一个方向传感器这么简单,事实上单独的方向传感器已经弃用,取而代之的是 ...

  2. Android 获取指南针数据

    要想实现指南针功能,android中不是有方向传感器吗?其实android的方向传感器不是物理实际存在的,它只是逻辑上的,什么意思,就是它是通过磁力计和加速度计抽象出来的.因此,这个方位的获得其实是通 ...

  3. Android学习-指南针(方向传感器)

    Android学习-指南针 效果图(背景图片网上随便找的): 1.编写布局文件activity_main.xml文件 主要放一个东南西北方向图片,一个指针图片用来指明方向 <?xml versi ...

  4. Android中实现为TextView添加多个可点击的文本

    这篇文章主要介绍了Android中实现为TextView添加多个可点击的文本,可实现类似Android社交软件显示点赞用户并通过用户名称进入该用户主页的功能,是非常实用的技巧,需要的朋友可以参考下.具 ...

  5. android 弹出fragment,Android中ViewPager获取当前显示的Fragment

    前言 在项目中,有时会用到在ViewPager中显示同样类型的Fragment,同时这样的Fragment的个数是动态的,但是PagerAdapter没有给我们提供getCurrentFragment ...

  6. android 读取内部存储文件格式,Android中的数据储存之文件存储

    当我们在使用各种程序时,其实际上是在和各种数据打交道,当我们聊QQ,刷微博,看新闻,其实都是在和里面的数据交互 例如在聊天时发出的消息,以及在登录时输入的账号密码,其实都是瞬时数据,那什么是瞬时数据呢 ...

  7. android中一种不支持的lua操作

    今天写了一段lua代码,在win32中正常运行,在android中运行无效. 大概是这样的: ------file1.lua----- local t = {} t.str = "this ...

  8. Android中对Log日志文件的分析[转]

    一,Bug出现了, 需要"干掉"它 bug一听挺吓人的,但是只要你懂了,android里的bug是很好解决的,因为android里提供了LOG机制,具体的底层代码,以后在来分析,只 ...

  9. 在Android中进行单元测试遇到的问题

    问题1.Cannot connect to VM  socket closed 在使用JUnit进行测试的时候,遇到这个问题.网上的解释是:使用Eclipse对Java代码进行调试,无论是远程JVM还 ...

最新文章

  1. [Spring MVC] - @ModelAttribute使用
  2. ATOM插件库,收藏以备不时仔细!
  3. 腐烂国度2怎么学计算机,腐烂国度2按键操作说明 腐烂国度2怎么操作
  4. 「声明」本博客自动采集于博客园-niceyoo
  5. 【UVA - 10891 Game of Sum 】【HRBUST - 1622】 Alice and Bob (区间dp,博弈问题)
  6. python读取两行字符串_python - 如何为两行之间的行分配值,并在数据帧的列中使用特定字符串? - SO中文参考 - www.soinside.com...
  7. 2018.4.3 做lab0
  8. S9300 STP 配置规范
  9. angular 倒计时
  10. 摩托罗拉gp3688说明书_摩托罗拉GP3688对讲机充电器电路原理分析
  11. Linux rpm 命令使用详解
  12. android9 三星 港版,三星S10+官方港版安卓9完整固件升级更新包:TGY-G9750ZHU1ASF1
  13. 图解WinXP局域网共享设置步骤
  14. DragonBones+Unity 实现换装
  15. 企业微信集成EAS流程助手
  16. excel简单操作。python
  17. Openstack 对象存储服务之争:Ceph或者Swift
  18. Linux中分卷压缩和合并解压
  19. 浏览器中实现3D全景浏览
  20. Qt: QXMLStreamReader,读XML文件实例

热门文章

  1. 慧算账张述刚荣获最佳产品领导力人物奖
  2. qt-qss之按键样式
  3. 【计算题】(六)微分方程和无穷级数
  4. 计算机语言替换,Zig 0.7.0 发布,想要替换 C的编程语言
  5. 榆熙教育:拼多多有效提高店铺出评率的技巧
  6. 抖音上的战斗力测试软件,战斗力测试app
  7. python 做行转列通过enbid对应多个cell一行显示
  8. 99mTc-MIBI类毕业论文文献都有哪些?
  9. We‘re sorry but XXX doesn‘t work properly without JavaScript enabled.
  10. 第1章第6节:如何打开之前编辑过的演示文稿 [PowerPoint精美幻灯片实战教程]