基于高德地图实现Android定位功能实现(二)

基于高德地图实现Android定位功能实现(二)

在实现的高德地图的基本显示后,我们需要不断完善地图的功能

地图界面设计(悬浮按钮等)

首先就是地图页面的布局,这个根据大家的实际需求进行设计即可,此次演示的布局效果如下:

638b6e4dfa479c57b2f7142ff4a6d166_720

这里需要使用悬浮按钮实现其效果:

首先需要倒入依赖库:

implementation 'com.getbase:floatingactionbutton:1.10.1'    //悬浮按钮

然后开始设计布局界面:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><com.amap.api.maps.MapViewandroid:id="@+id/map"android:layout_width="match_parent"android:layout_height="match_parent" /><com.getbase.floatingactionbutton.FloatingActionsMenuandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentStart="true"android:layout_alignParentBottom="true"android:layout_marginBottom="10dp"app:fab_addButtonSize="normal"app:fab_expandDirection="up"> <!-- 设置展开方向为向上 --><com.getbase.floatingactionbutton.FloatingActionButtonandroid:id="@+id/btn_scanner"android:layout_width="wrap_content"android:layout_height="wrap_content"app:fab_colorNormal="#FFF"app:fab_icon="@drawable/baseline_center_focus_strong_24"app:fab_size="normal" /><com.getbase.floatingactionbutton.FloatingActionButtonandroid:id="@+id/btn_Traffic"android:layout_width="wrap_content"android:layout_height="wrap_content"app:fab_colorNormal="#FFF"app:fab_icon="@drawable/baseline_traffic_24"app:fab_size="normal" /><com.getbase.floatingactionbutton.FloatingActionButtonandroid:id="@+id/btn_Map_Type"android:layout_width="wrap_content"android:layout_height="wrap_content"app:fab_colorNormal="#FFF"app:fab_icon="@drawable/baseline_map_24"app:fab_size="normal" /></com.getbase.floatingactionbutton.FloatingActionsMenu></RelativeLayout>

其中的图标文件大家自行选择即可,第一个功能目前是实现扫码功能,第二个切换交通图层,第三个开启地图的不同模式;

通过悬浮按钮实现切换地图类型

使MainActivity继承View.OnClickListener

public class MainActivity extends Activity implements View.OnClickListener{//相关代码@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//代码块...}@Overridepublic void onClick(View view) {}
}

绑定组件的id

private FloatingActionButton mBtnScanner, mBtnTraffic, mBtnMapType;//绑定组件
mBtnScanner = findViewById(R.id.btn_scanner);
mBtnTraffic = findViewById(R.id.btn_Traffic);
mBtnMapType = findViewById(R.id.btn_Map_Type);//设置点击时间
mBtnTraffic.setOnClickListener(this);
mBtnScanner.setOnClickListener(this);
mBtnMapType.setOnClickListener(this);

设置对应的点击事件:

@Override
public void onClick(View view) {switch (view.getId()) {case R.id.btn_scanner:Toast.makeText(this, "开始扫码", Toast.LENGTH_SHORT).show();break;case R.id.btn_Traffic://切换交通图层显示状态isTrafficEnabled = !isTrafficEnabled;aMap.setTrafficEnabled(isTrafficEnabled);Toast.makeText(this, "切换图层显示状态", Toast.LENGTH_SHORT).show();break;case R.id.btn_Map_Type:if (flag == 0) {//设置夜间模式Toast.makeText(this, "夜间模式", Toast.LENGTH_SHORT).show();aMap.setMapType(AMap.MAP_TYPE_NIGHT);} else if (flag == 1) {//设置卫星模式Toast.makeText(this, "卫星模式", Toast.LENGTH_SHORT).show();aMap.setMapType(AMap.MAP_TYPE_SATELLITE);} else if (flag == 2) {//设置正常模式Toast.makeText(this, "正常模式", Toast.LENGTH_SHORT).show();aMap.setMapType(AMap.MAP_TYPE_NORMAL);}flag = (flag + 1) % 3;break;default:Toast.makeText(this, "其他error", Toast.LENGTH_SHORT).show();break;}
}

效果如下:
在这里插入图片描述

UISetting控件交互

官方文档:控件交互

控件是指浮在地图图面上的一系列用于操作地图的组件,例如缩放按钮、指南针、定位按钮、比例尺等。

UiSettings 类用于操控这些控件,以定制自己想要的视图效果。UiSettings 类对象的实例化需要通过 AMap 类来实现:

//地图的 UISettings 对象,给aMap设置地图的内嵌控件
private UiSettings mUiSettings = null;//获取UISettings
mUiSettings = aMap.getUiSettings();//实例化UiSettings类对象
  1. 缩放按钮

    缩放按钮是提供给 App 端用户控制地图缩放级别的交换按钮,每次点击改变1个级别,默认打开,但是可以通过下面方法将其隐藏起来:

    //缩放按钮
    mUiSettings.setZoomControlsEnabled(false);
    
  2. 指南针

    指南针用于向 App 端用户展示地图方向,默认不显示。通过下面方法可以显示:

    //指南针
    mUiSettings.setCompassEnabled(true);
    
  3. 定位按钮

    App 端用户可以通过点击定位按钮在地图上标注一个蓝色定位点,代表其当前位置。不同于以上控件,定位按钮内部的逻辑实现依赖 Android 定位 SDK。

    //定位按钮
    mUiSettings.setMyLocationButtonEnabled(true);   //显示默认的定位按钮
    
  4. 比例尺控件

    比例尺控件(最大比例是1:10m,最小比例是1:1000Km),位于地图右下角,可控制其显示与隐藏,设置的方法是

    //比例尺控件
    mUiSettings.setScaleControlsEnabled(true);  //控制比例尺控件是否显示
    

在这里插入图片描述

  1. 地图logo控件

    高德地图的 logo 默认在左下角显示,不可以移除,但支持调整到固定位置。设置的方法是:

    //地图logo
    mUiSettings.setLogoPosition(AMapOptions.LOGO_POSITION_BOTTOM_RIGHT);
    // 地图logo只能显示三个位置,底部的左、中、右三个地方
    // 对应的属性分别为AMapOptions.LOGO_POSITION_BOTTOM_LEFT、AMapOptions.LOGO_POSITION_BOTTOM_CENTER、AMapOptions.LOGO_POSITION_BOTTOM_RIGHT
    

在这里插入图片描述

开启定位服务

在开启定位服务时,不需要重新导包,因为地图SDK中包含了开启定位服务的功能,并且提供了两种不同的接口。

官方文档:[开发 Android 定位SDK 开发指南 获取位置 获取定位数据](https://lbs.amap.com/api/android-location-sdk/guide/android-location/getlocation)

首先,配置AndroidManifest.xml

  1. 首先,声明Service组件

    <service android:name="com.amap.api.location.APSService"></service>
    
  2. 声明权限(覆盖之前的权限即可)

    <!--用于进行网络定位--><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><!--用于访问GPS定位--><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><!--用于获取运营商信息,用于支持提供运营商信息相关的接口--><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><!--用于访问wifi网络信息,wifi信息会用于进行网络定位--><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><!--用于获取wifi的获取权限,wifi信息会用来进行网络定位--><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><!--用于访问网络,网络定位需要上网--><uses-permission android:name="android.permission.INTERNET" /><!--用于写入缓存数据到扩展存储卡--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!--用于申请调用A-GPS模块--><uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /><!--如果设置了target >= 28 如果需要启动后台定位则必须声明这个权限--><uses-permission android:name="android.permission.FOREGROUND_SERVICE" /><!--如果您的应用需要后台定位权限,且有可能运行在Android Q设备上,并且设置了target>28,必须增加这个权限声明--><uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    
  3. 正文部分

    首先需要声明两个对象,其实就是创建一个客户端定位句柄:

    //声明AMapLocationClient类对象
    public AMapLocationClient mLocationClient = null;
    //声明定位毁掉监听器
    public AMapLocationListener mLocationListener = null;//onCreate()函数部分代码
    //初始化定位
    try {mLocationClient = new AMapLocationClient(getApplicationContext());
    } catch (Exception e) {throw new RuntimeException(e);
    }
    //设置定位回调监听
    mLocationClient.setLocationListener(mLocationListener);
    

    接下来就是配置参数并启动定位了,在配置参数之前,首先创建一个对象,方便给定位客户端设置属性:

    //声明AMapLocationClientOption对象
    public AMapLocationClientOption mLocationOption = null;//初始化AMapLocationClientOption对象---onCreate()函数部分
    mLocationOption = new AMapLocationClientOption();
    

    接下来就可以配置参数了,配置参数方面,可以设置设置单次定位、选择定位模式、自定义连续定位等,这里设置了自定义连续定位了,方便查看:

    //自定义连续定位
    //设置定位间隔,单位毫秒,默认为2000ms,最低1000ms
    mLocationOption.setInterval(3000);
    //将option设置给client对象
    mLocationClient.setLocationOption(mLocationOption);
    

    那么如何获取定位数据呢?AMapLocationListener接口只有onLocationChanged方法可以实现,用于接收异步返回的定位结果,回调参数是AMapLocation。接下来就需要给客户端句柄设置监听器处理服务器返回的数据:

    //设置定位会调监听--获取定位结果
    mLocationClient.setLocationListener(new AMapLocationListener() {@Overridepublic void onLocationChanged(AMapLocation aMapLocation) {}
    });
    

    接下来可以查看定位数据的具体内容了:

    if (aMapLocation != null) {if (aMapLocation.getErrorCode() == 0) {//可在其中解析aMapLocation获取相应内容} else {//定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。Log.e("aMapError", "location Error, ErrCode:"+ aMapLocation.getErrorCode() + ", errInfo:"+ aMapLocation.getErrorInfo());}
    }
    

    为了方便我们直观的观看数据,在控制台打印我们需要查看的数据即可:

    Log.e(TAG, "国家:" + aMapLocation.getCountry());
    Log.e(TAG, "当前地址:" + aMapLocation.getAddress());
    Log.e(TAG, "当前城市:" + aMapLocation.getCity());
    Log.e(TAG, "经度:" + aMapLocation.getLongitude());
    Log.e(TAG, "纬度:" + aMapLocation.getLatitude());
    Log.e(TAG, "城区:" + aMapLocation.getDistrict());
    Log.e(TAG, "街道:" + aMapLocation.getStreet());
    Log.e(TAG, "街道门牌号:" + aMapLocation.getStreetNum());
    Log.e(TAG, "城市编码:" + aMapLocation.getCityCode());
    Log.e(TAG, "区域编码:" + aMapLocation.getAdCode());
    Log.e(TAG, "当前位置POI名称:" + aMapLocation.getPoiName());
    Log.e(TAG, "当前位置所处AOI名称:" + aMapLocation.getAoiName());
    Log.e(TAG, "---------------------------------");
    

    需要其他数据可以查找官方文档查看对应的接口即可 https://developer.amap.com/api/android-location-sdk/guide/android-location/getlocation

    最后就是启动定位了:

    //启动定位
    mLocationClient.startLocation();
    

    最后运行程序,查看我们是否实现了定位数据:
    在这里插入图片描述

至此,就拿到了定位数据了了,下篇将会讲述如何实现以自我为中心展示地图了;

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

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

相关文章

前后端数据交互设计到的跨域问题

前后端分离项目的跨域问题及解决办法 一、跨域简述 1、问题描述 这里前端vue项目的端口号为9000&#xff0c;后端springboot项目的端口号为8080 2、什么是跨域 当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域 当前页面url被请求页面url是否…

cuda缓存示意图

一、定义 cuda 缓存示意图gpu 架构示意图gpu 内存访问示意图 二、实现 cuda 缓存示意图 DRAM: 通常指的是GPU的显存&#xff0c;位于GPU芯片外部&#xff0c;通过某种接口&#xff08;如PCIE&#xff09;与GPU芯片相连。它是GPU访问的主要数据存储区域&#xff0c;用于存储大…

使用dnscat2 进行dns隧道反弹shell——直连模式linux对windows

直连模式&#xff1a;客户端直接向指定IP地址的DNS服务器发起DNS解析请求 环境搭建 搭建服务端 git clone https://github.com/iagox86/dnscat2.git cd dnscat2/server/ gem install bundler apt-get install ruby-dev bundle install 过程会有点慢 开启服务端 ruby ./dn…

二叉搜索树的实现[C++]

文章目录 搜索二叉树概念二叉搜索树的功能查找 实现搜索二叉树节点的定义建立搜索二叉树接口插入搜索打印删除 总结 今天本堂主来一起讨论下什么是搜索二叉树&#xff0c;和如何实现二叉搜索树 搜索二叉树 那么二叉搜索树似乎如何实现搜索呢&#xff1f;二叉搜索树和普通二叉…

linux 之时间子系统(八):hrtime 的实现机制

一、hrtimer 概述 在Linux内核中已经存在了一个管理定时器的通用框架。不过它也有很多不足&#xff0c;最大的问题是其精度不是很高。哪怕底层的定时事件设备精度再高&#xff0c;定时器层的分辨率只能达到Tick级别&#xff0c;按照内核配置选项的不同&#xff0c;在100Hz到10…

数据库管理1

数据库管理 数据库运维。 sql语句 数据库用来增删改查的语句 备份 数据库的数据进行备份 主从复制&#xff0c;读写分离&#xff0c;高可用。 数据库的概念和相关的语法和规范&#xff1a; 数据库&#xff1a;组织&#xff0c;存储&#xff0c;管理数据的仓库。 数据库的管理系…

一篇文章让你掌握计算网络的HTTP协议!!

HTTP 浏览器的服务原理http协议webTCP/IP协议族TCP/IP协议族分层应用层传输层网络层链路层数据包的封装过程HTTP数据传输过程传输层——TCP三次握手第一次握手第二次握手第三次握手三次握手的目的DNS域名解析HTTP完整事务处理过程HTTP协议的特点支持客户/服务器模式简短快速灵活…

钡铼Modbus TCP耦合器BL200实现现场设备与SCADA无缝对接

前言 深圳钡铼技术推出的Modbus TCP耦合器为SCADA系统与现场设备之间的连接提供了强大而灵活的解决方案&#xff0c;它不仅简化了设备接入的过程&#xff0c;还提升了数据传输的效率和可靠性&#xff0c;是工业自动化项目中不可或缺的关键设备。本文将从Modbus TC、SCADA的简要…

Apache网页优化(企业网站结构部署与优化)

本章结构 一、Apache网页优化 在使用 Apache 作为 Web 服务器的过程中&#xff0c;只有对 Apache 服务器进行适当的优化配置&#xff0c;才能让 Apache 发挥出更好的性能。反过来说&#xff0c;如果 Apache 的配置非常糟糕&#xff0c;Apache可能无法正常为我们服务。因此&…

Java8的新特性

Java8的新特性 一、函数式接口1、Java内置的函数式接口 二、Lambda表达式1、Lambda作用2、语法3、Lambda表达式的六种使用3.1、抽象方法&#xff1a;无参、无返回值3.2、抽象方法&#xff1a;需要传一个参数、无返回值3.3、抽象方法&#xff1a;需要传一个参数&#xff08;类型…

【iOS】OC类与对象的本质分析

目录 前言clang常用命令对象本质探索属性的本质对象的内存大小isa 指针探究 前言 OC 代码的底层实现都是 C/C代码&#xff0c;OC 的对象都是基于 C/C 的数据结构实现的&#xff0c;实际 OC 对象的本质就是结构体&#xff0c;那到底是一个怎样的结构体呢&#xff1f; clang常用…

IDEA实现SpringBoot项目的自打包自发布自部署

目录 前言 正文 操作背景 自发布 自部署 尾声 &#x1f52d; Hi,I’m Pleasure1234&#x1f331; I’m currently learning Vue.js,SpringBoot,Computer Security and so on.&#x1f46f; I’m studying in University of Nottingham Ningbo China&#x1f4eb; You can reach…

qt 创建一个左侧边线拖拽的矩形

1.概要 2.代码 2.1 代码第一版 在Qt中&#xff0c;要创建一个可以向左侧拖拽边线的矩形&#xff0c;你需要自定义一个QGraphicsRectItem的子类&#xff0c;并重写其事件处理函数来响应鼠标的拖拽动作。以下是一个简单的实现示例&#xff1a; #include <QApplication>…

设计模式——装饰者模式

设计模式——装饰者模式 1.问题1.1 方案一1.2 方案二 2.装饰者模式2.1 基本介绍2.2 结构2.3 代码实现 3.小结 1.问题 咖啡订单项目&#xff1a; 咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(无因咖啡)调料:Milk、Soy(豆浆)、Chocolat…

GB35114控制信令认证流程

GB35114控制信令认证说明&#xff1a; 注册成功后,信令发送方与信令接收方进行交互时,采用基于带密钥的杂凑方式保障信令来源安 全&#xff61;对除REGISTER消息以外的消息做带密钥的杂凑&#xff61;启用Date字段,扩展信令消息头域,在头域中 增加 Note 字 段 (值 为 Digest…

项目经理到底要不要考PMP?

在接待PMP学员中我惊讶地发现&#xff0c;不仅是项目经理&#xff0c;连开发、测试、产品、运营、销售、甚至财务团队的朋友们也都在积极备考。他们考证的原因主要有这几点&#xff1a; 1&#xff0c;职业发展&#xff1a;希望在职业生涯中晋升或转型到项目管理角色的朋友来说…

Spring MVC 全注解开发

1. Spring MVC 全注解开发 文章目录 1. Spring MVC 全注解开发2. web.xml 文件 的替代2.1 Servlet3.0新特性2.2 编写 WebAppInitializer 3. Spring MVC的配置3.1 Spring MVC的配置&#xff1a;开启注解驱动3.2 Spring MVC的配置&#xff1a;视图解析器3.3 Spring MVC的配置&…

SourceTree rebase(变基)的使用

参考资料 【Sourcetree】コミットを一つにまとめる【Sourcetree】リベースする 目录 前提0.1 merge与rebase0.2 merge合并分支0.3 rebase合并分支0.4 &#x1f4a5;超级注意事项&#x1f4a5; 一. 代码已提交&#xff0c;未推送&#xff0c;交互式变基1.1 通过SourceTree操作1…

【NLP实战】基于TextCNN的新闻文本分类

TextCNN文本分类在pytorch中的实现 基于TextCNN和transformers.BertTokenizer的新闻文本分类实现&#xff0c;包括训练、预测、数据加载和准确率评估。 目录 项目代码TextCNN网络结构相关模型仓库准备工作项目调参预测与评估 1.项目代码 https://github.com/NeoTse0622/Te…