android开发百度地图api实现定位图标随手机方向转动

该功能的实现依赖于手机中的传感器元件如陀螺仪、加速度计等,具体开发详见android的官方开发文档:

传感器概览  |  Android 开发者  |  Android Developersicon-default.png?t=N7T8https://developer.android.com/guide/topics/sensors/sensors_overview?hl=zh-cn要自定义一个传感器监听器类实现该功能,套路与实现定位功能类似,但是网上关于定位图标随手机方向转动的文章并不多,且大多割裂了与定位功能之间的联系。

首先自定义一个传感器监听器类:

    //自定义传感器监听器类public  class MyOrientationListener implements SensorEventListener{private SensorManager sensorManager;//注册传感器监听器方法public void registerSensorListener() {sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_UI);}// 关闭传感器监听器的方法public void unregisterSensorListener() {sensorManager.unregisterListener(this);}// 监听传感器变化事件,当传感器数值发生变化时,该方法被调用public void onSensorChanged(SensorEvent sensorEvent) {// 读取传感器数值中的 x 轴方向的值double x = sensorEvent.values[SensorManager.DATA_X];// 判断当前 x 轴方向的值与上一次记录的值之间的差值是否超过了 1.0,如果超过了 1.0,更新当前方向为新的 x 轴方向的值。if (Math.abs(x - lastX) > 1.0) {mCurrentDirection = (float) x;// 构造定位图层数据MyLocationData  myLocationData = new MyLocationData.Builder().accuracy(mCurrentAccracy)// 此处设置开发者获取到的方向信息,顺时针0-360.direction(mCurrentDirection).latitude(mCurrentLantitude).longitude(mCurrentLongtitude).build();// 设置定位图层数据baiduMap.setMyLocationData(myLocationData);}// 将当前 x 轴方向的值记录为上一次的值,用于下一次比较lastX = x;}public void onAccuracyChanged(Sensor sensor, int accuracy) {// 传感器精度变化时的回调方法}}

SensorEventListener是一个接口,它用于监听传感器事件的回调。当与传感器相关的事件发生时,系统会调用 SensorEventListener 的方法来通知你。

在这个类中要自己实现注册监听器和注销监听器的方法,这两种方法的实现官方文档中都有,可以直接用:

定位图标指示方向 | 百度地图API SDK (baidu.com)icon-default.png?t=N7T8https://lbsyun.baidu.com/index.php?title=%E5%AE%9A%E4%BD%8D%E5%9B%BE%E6%A0%87%E6%8C%87%E7%A4%BA%E6%96%B9%E5%90%91关键是onSensorChanged这个方法,是该功能实现的核心,在该方法中定义了处理传感器信息的逻辑,如何确定方向。

在构造定位图层数据时,经纬度和精确度都可以从定位功能的监听器中直接取:

定位功能实现详见android开发调用百度地图api实现加载地图和定位-CSDN博客

  //通过继承抽象类BDAbstractListener并重写其onReceieveLocation方法来获取定位数据,并将其传给MapView。public class MyLocationListener extends BDAbstractLocationListener  {@Overridepublic void onReceiveLocation(BDLocation location) {int locType = location.getLocType();Log.d("定位结果错误码", String.valueOf(locType));//mapView 销毁后不再处理新接收的位置if (location == null || mMapView == null) {             //判断 location 和 mMapView 是否为空来确保在地图视图销毁后不再处理新接收的位置return;}mCurrentLongtitude = location.getLongitude();mCurrentLantitude = location.getLatitude();mCurrentAccracy = location.getRadius();MyLocationData locData = new MyLocationData.Builder()       //通过 Builder 模式,设置位置的精度、方向、纬度和经度等属性。.accuracy(location.getRadius())// 从传感器拿到方向信息.direction(mCurrentDirection).latitude(location.getLatitude()).longitude(location.getLongitude()).build();baiduMap.setMyLocationData(locData);                //将新的位置信息更新到地图上,以显示当前设备的位置

 其中mCurrentLongtitude、mCurrentLantitude、mCurrentAccracy这三个变量在MainActivity的onCreate方法之前定义,在定位监听器中获取经纬度和精确度值然后在传感器监听器中使用。

但是关键在方向的获取:

博主最开始编写完该功能之后,发现一个现象:图标箭头可以随着手机的转动而转动,但是每当转动一个角度之后都会弹回最开始的方向,并不能最终指向正确方向,经过研究,博主发现是因为传感器获取到的方向信息并没有持续传递给定位功能,导致每次手机停止转动之后,定位监听器类拿到的方向信息都不是手机的最新方向。

所以当每次传感器类中计算完方向之后都要把方向传递给定位功能:

 //通过 Builder 模式,设置位置的精度、方向、纬度和经度等属性。       
MyLocationData locData = new MyLocationData.Builder()      .accuracy(location.getRadius())// 从传感器拿到方向信息.direction(mCurrentDirection).latitude(location.getLatitude()).longitude(location.getLongitude()).build();

最后还要打开显示方向信息:

这部分代码放在onCreate()中就可以

 // 创建 MyLocationConfiguration 对象并设置相关属性,enableDirection=true则允许显示方向MyLocationConfiguration config = new MyLocationConfiguration(MyLocationConfiguration.LocationMode.FOLLOWING, // 定位模式为跟随态                true, // 显示方向信息null,0xAAec2d7a, // 填充颜色0xAA2376b7 // 描边颜色);baiduMap.setMyLocationConfiguration(config);

注册监听器和注销监听器的方法不要忘记调用:

    @Overrideprotected void onResume() {super.onResume();//开始传感器监听myOrientationListener.registerSensorListener();//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理mMapView.onResume();}@Overrideprotected void onPause() {super.onPause();//终止传感器监听myOrientationListener.unregisterSensorListener();//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理mMapView.onPause();}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/229518.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zookeeper之集群搭建

1. 集群角色 zookeeper集群下,有3种角色,分别是领导者(Leader)、跟随着(Follower)、观察者(Observer)。接下来我们分别看一下这三种角色的作用。 领导者(Leader): 事务请求(写操作)的唯一调度者和处理者,保…

【Spring Security】认证之案例的使用、MD5加密、CSRF防御

目录 一、引言 1、什么是SpringSecurity认证 2、为什么使用SpringSecurity之认证 3、实现步骤 二、快速实现(案例) 1、添加依赖 2、配置 3、导入数据表及相关代码 4、创建登录页及首页 5、创建配置Controller 6、用户认证 6.1、用户对象User…

【LabVIEW FPGA入门】创建第一个LabVIEW FPGA程序

本教程仅以compactRIO(FPGA-RT)举例 1.系统配置 1.1软件安装 FPGA-RT 1. LabVIEW Development System (Full or Professional) 2. LabVIEW Real-Time Module 3. LabVIEW FPGA Module 4. NI-RIO drivers 1.2硬件配置 1.使用线缆连接CompactRIO至主机…

uniapp的css样式图片大小截图展示

目录 截取图片前截取图片后第一种方式&#xff1a;代码第二种方式&#xff1a;代码最后 截取图片前 截取图片后 第一种方式&#xff1a;代码 <view class"swiper-box-img"><image class"swiper-box-img-img" :src"item.file_path" mod…

ARM CCA机密计算架构软件栈之软件组件介绍

在本节中,您将了解Arm CCA的软件组件,包括Realm World和Monitor Root World。以下图表展示了Arm CCA系统中的软件组件: 在这个图表中,世界之间的边界显示为粗虚线。由较高权限的软件强制执行的较低权限软件组件之间的边界显示为细虚线。例如,非安全EL2处的虚拟机监视器强制…

java企业网站系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web企业网站系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

Jenkins的Transfers路径怎么配置,解决Transfers配置不生效的问题

Transfers配置: 1.配置Source files: 要填写jar包的相对路径,从当前项目工作空间的根目录开始,看看我的工作空间你就懂了 !如图 我填的是 parent/build/libs/parent-1.0.0.jar,即不要 fdw1/ 的前缀 2.配置Remote directory: 远程目标文件夹,也就是你jar包要放到远程…

第一个Python程序

安装好python解释器之后呢&#xff0c;我们打开PyCharm 这里选择使用本地解释器 注意这个python.exe的路径&#xff0c;AppData是隐藏文件夹 创建完成项目之后&#xff0c;点击new->Python File 写入 print(hello world)输出

分布式【zookeeper面试题12连问】

1. 面试官&#xff1a;工作中使用过Zookeeper嘛&#xff1f;你知道它是什么&#xff0c;有什么用途呢&#xff1f; 「小菜鸡的我&#xff1a;」 有使用过的&#xff0c;使用ZooKeeper作为**「dubbo的注册中心」&#xff0c;使用ZooKeeper实现「分布式锁」**。ZooKeeper&#…

Kafka安全认证机制详解之SASL_PLAIN

一、概述 官方文档&#xff1a; https://kafka.apache.org/documentation/#security 在官方文档中&#xff0c;kafka有五种加密认证方式&#xff0c;分别如下&#xff1a; SSL&#xff1a;用于测试环境SASL/GSSAPI (Kerberos) &#xff1a;使用kerberos认证&#xff0c;密码是…

elasticsearch列一:索引模板的使用

概述 近期一直在负责es这块&#xff0c;就想着和大家分享一些使用经验&#xff0c;我们从存储、查询、优化、备份、运维等几个方面来做分享。今天咱们先看下如何更加合理的存储数据。 初见索引模板 记得刚接触es还是18年那会&#xff0c;项目上线后因一些原因导致日志这部分的…

C语言——小细节和小知识7

一、逆序字符串 1、递归1 #include <stdio.h> #include <string.h>void ReverseArray(char *str) {char temp *str;//1int len (int)strlen(str);*str *(str len - 1);//2*(str len - 1) \0;//3if(strlen(str 1) > 2)//只要字符串还大于2&#xff0c;就…

企业微信开发:自建应用:获取企业微信IP段(用于防火墙配置)

概述 在企业微信开发流程中&#xff0c;为了确保与企业微信API的网络通信安全&#xff0c;并适应防火墙配置要求&#xff0c;开发者需要获取企业微信API服务的IP地址范围。这样&#xff0c;仅允许与企业微信官方通信的合法请求通过防火墙&#xff0c;从而保障数据传输的安全性…

SpringBoot整合多数据源,并支持动态新增与切换

SpringBoot整合多数据源&#xff0c;并支持动态新增与切换 一、概述 在项目的开发过程中&#xff0c;遇到了需要从数据库中动态查询新的数据源信息并切换到该数据源做相应的查询操作&#xff0c;这样就产生了动态切换数据源的场景。为了能够灵活地指定具体的数据库&#xff0…

dyld: Library not loaded: /usr/lib/swift/libswiftCoreGraphics.dylib

更新Xcode14后低版本iPhone调试报错 dyld: Library not loaded: /usr/lib/swift/libswiftCoreGraphics.dylib Referenced from: /var/containers/Bundle/Application/…/….app/… Reason: image not found 这是缺少libswiftCoreGraphics库 直接导入libswiftCoreGraphics库即…

python小工具之弱密码检测工具

一、引用的python模块 Crypto&#xff1a; Python中一个强大的加密模块&#xff0c;提供了许多常见的加密算法和工具。它建立在pyc.ypodome或pyc.ypto等底层加密库之上&#xff0c;为Python程序员提供了简单易用的API&#xff0c;使其可以轻松地实现各种加密功能。 commands…

2024新年快乐

前言 2023年马上就要过去&#xff0c;希望2024年会越来越好&#xff0c;根据自己学的内容来实现一些我的idea。 单片机 思路 最开始的构思是这样的&#xff0c;“2024”用数码管来输出然后中文的“新年快乐”用点阵来实现&#xff0c;但是点阵是动态的截图不好看&#xff0…

Jenkins部署项目

一.安装jenkins 1.1进入jenkins官网下载jenkins war包&#xff0c;上传到服务器/usr/local目录。 1.2执行启动jenkins命令&#xff0c;&#xff08;注意jenkins版本需要的jdk版本&#xff09; /usr/local/java11/bin/java -Djava.awt.headlesstrue -jar /usr/local/jenkins.wa…

【Linux】进程控制深度了解

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟练掌握Linux下的进程控制 > 毒鸡汤&#xff…

经典卷积神经网络-VGGNet

经典卷积神经网络-VGGNet 一、背景介绍 VGG是Oxford的Visual Geometry Group的组提出的。该网络是在ILSVRC 2014上的相关工作&#xff0c;主要工作是证明了增加网络的深度能够在一定程度上影响网络最终的性能。VGG有两种结构&#xff0c;分别是VGG16和VGG19&#xff0c;两者并…