专栏名称: 郭霖
Android技术分享平台,每天都有优质技术文章推送。你还可以向公众号投稿,将自己总结的技术心得分享给大家。
目录
相关文章推荐
鸿洋  ·  一个大型 Android 项目的模块划分哲学 ·  3 天前  
鸿洋  ·  细嗅蔷薇,Gradle 系列之 Task 必知必会 ·  4 天前  
鸿洋  ·  理解Android ... ·  5 天前  
鸿洋  ·  Android H5页面性能分析策略 ·  1 周前  
51好读  ›  专栏  ›  郭霖

高仿微信发送位置(高德地图版)

郭霖  · 公众号  · android  · 2016-10-27 08:00

正文

今日科技快讯

市场研究机构发布最新数据显示:2016年第三季度,OPPO 在国内的市场份额为16.6%,高居榜首;vivo 以16.2%屈居次席。OPPO 和 vivo 同时超越华为的15%,一跃成为国内前两大智能手机厂商。

专业人士分析,OPPO 主要归功于 R9 的惊艳表现,R9 第三季度的销量已经超过了iPhone;而 vivo 主要依靠旗舰产品 X7 系列。他们产品的成功一定程度依赖于线下零售和良好的分销网络。如今,两大老牌手机厂商华为和小米都已被这两个靠综艺节目冠名而出名的手机厂商所超越。

作者简介

本篇来自 阿敏其人 的投稿,跟大家分享了他是如何使用高德地图API实现定位功能的,希望对大家能够有所帮助。

阿敏其人 的博客地址:

http://www.jianshu.com/users/9ea3fea67109

前言

我们先来看一下原版的微信发送位置。嗯,是发送位置,为什么不带发送实时位置,缺个另外一个真机。嗯,买一个16年出的google亲儿子,嗯,信仰充值先想想就好!

微信原版发送位置

接下来,再来看一下自己的程序gif:

嗯哼,看完啦。

需求分析

从原版微信的gif当中,我们看到,大概可以分为这么几个行为:

1. 进入页面,产生两个标记点,周围地点列表。

  • 两个标记点:一个是 固定不变 当前位置的定位圆形标记;一个是 可移动 红色标记并且,会根据当前经纬度改变位置

  • 地址列表:就是根据当前刚进入页面的经纬度搜索的出来的 附近poi (附近兴趣点

2. 当我们点击周围点的列表,列表更新圆形绿色切换,这点没什么好说,需要注意的是:

  • 地图会动态改变位置

  • 可移动的地图上的 红色标记 处于地图的 中心点位置

3. 当我们手动拖动地图,这时候两点注意:

  • 当手势松开的时候,可移动 红色标记 移动并且居中

  • 周围 poi列表 信息更新,而且第一条信息是我们当前屏幕的中心点所获取的地址,这个地址 逆地里编码 得到的,即经纬度转地址

4. 点击搜索条关键字,按关键字进行搜索展示列表:

  • 第一个 poi 信息作为 默认选择item

  • 如果我们不按下item,直接返回,那么之前页面的信息不变,地址照旧

  • 如果我们按下item,那么该item作为之前页面的poi地址列表 第一条item,并且搜索附近的 poi信息。

嗯,大概这么就是介么个样子,页面简单,写成文字还是看起来巴拉巴拉一大堆的。我们的demo大概也就是围绕着上面几点展开的。

环境说明

  • 当前微信版本:6.3.25

  • android高德地图版本:

16年9月份官网给的

  • 测试机器:菊花荣耀7,Android6.0。

  • IDE: AS。

嗯,交代完毕。

开码

我们这里涉及到三个Activity,分别是:

  • JwActivity:得到定位,暂且叫做 A页面

  • ShareLocActivity:发送位置页面 暂且叫做 B页面

  • SeaechTextAddressActivity:搜索页面 暂且叫做 C页面

1. 发送位置,最基本我们需要获得定位

之前弄得工具类,客官您将就着用,首先是权限部分:


具体代码:


好啦,调用一下,奔着分享位置的页面去拉:


2. 逆地理编码,经纬度转地址

从这里开始,我们就跳到了B页面啦~

B页面 拿到 A页面 的经纬度之后,就开始心急火燎地想把经纬度转地址啦!这个时候 逆地理编码 出现了。

逆地理编码 大概是这么几步走的:

 1、得到 GeocodeSearch 的实例

 2、实现 GeocodeSearch.OnGeocodeSearchListener 接口

 3、实现接口就必须实现实现一下两方法 onRegeocodeSearched onGeocodeSearched

Geocode 是地理编码的意思,Regeocode 就是逆地理编码的。

所以我们主要逆地理实现逻辑都在 onRegeocodeSearched 方法,转成代码大概就是:

step1:

private GeocodeSearch geocoderSearch;

step2:

geocoderSearch = new GeocodeSearch(this);

step3:


返回码 1000 表示转换成功,拿到我们 RegeocodeResult 的形参我们可以得到地址。

3. 根据经纬度搜索周围poi信息

poi搜索分 搜索关键字搜索经纬度

官网的demo提供了搜索关键字的,但是没有相应的按照经纬度的,其实做起来也差不多,但是一开始看文档找呀找,找不到,为什么不也示例一下。

其实使用方法也是比较类似的。

 1. 首先我们要得到 private PoiSearch.Query 的实例。

 2. 按需求设置搜索配置。

  • 按经纬度搜索该点周围的poi信息


  • 按照关键字搜索附近的poi信息


不管是按照关键字还是按照经纬度,我们都要利用 setOnPoiSearchListener 实现搜索 poi 的接口,然后实现 onPoiSearchedonPoiItemSearched 这两个方法,在关键 onPoiSearched 方法里面我们可以得到搜索的 poi 结果集合。

4. 在onPoiSearched方法里面操作数据,更新列表


这么一个流程跑下来,poi数据就拿到了。

5. 拖动地图

实现 OnCameraChangeListener 接口 mAMap.setOnCameraChangeListener(this);

实现 onCameraChange onCameraChangeFinish 两个方法:


这里需要注意的是:mAMap.moveCamera 方法可以通过代码手动移动地图,他会自动调用 onCameraChangeFinish 方法(OnCameraChangeListener 按道理也是会的)。


嗯,大概就是这样子了。

至于 C页面(就是我们在 B页面 按下搜索键跳转的页面,他其实也就是关键字搜索)

总结

嗯,到这里就差不多了。其实结合官方demo,折腾起来也就差不多了。

程序有一个小bug,微信拖动地图的时候,基本上算作是精准的,但是我们这里移动地图红色标记选择一个点然后松开手指之后,有时候没办法准确地拿到当前停留的点的准确地址。

对于这个bug,其实我也不想,但是高德给我的逆地理编码确实就是出不来的,有时很大一个范围拖动逆地理出来的都是同一个地址,如果我把点选在某一个大酒店或者标志性的地方的时候,是没什么问题的。

点击最后 阅读原文 查看源码。

更多

每天学习累了,看些搞笑的段子放松一下吧。关注最具娱乐精神的公众号,每天都会有好心情。

如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。

欢迎长按下图 -> 识别图中二维码或者扫一扫关注我的公众号: