百度地图开发的笔记(篇2)高仿微信发送位置功能

本篇主要记录在实现这个功能时,遇到的一些问题以及解决,具体的实现代码在下篇文章中贴出

百度地图开发的笔记(篇3)高仿微信发送位置功能

首先看下效果图:

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

主要功能(参照微信发送定位):
  • 1.定位所在位置并且展示周边POI(建筑物等信息);
  • 2.拖拽地图完成,返回中心覆盖物所处位置周边的POI信息;
  • 3.支持关键词等搜索,每次搜索完成,中央覆盖物移动到第一条POI信息的相应位置;
  • 4.点击右上角的图标,中央覆盖物回到所定位的位置;
  • 5.点击下边列表的某条数据,将中央覆盖物移至该条数据对应的位置;
  • 6.发送定位时,有相应的地图位置截图和地址信息.
主要问题及解决

1.如何添加地图中央覆盖物,随着对地图的拖拽,覆盖物始终在地图中心?

第一眼是不是感觉中央覆盖物,不就是添加个marker,一开始我也这么实现的,然后监听地图的移动,不断让marker移动到屏幕的地图中心点。
虽然也是能实现,但是明显界面卡顿,核心代码在下图:

这里写图片描述

这种方法很明显,是不行的。后来参照58速运App定位功能,对其布局进行查看,原来中央覆盖物是一个ImageView,浮动在MapView中央。那就可以这么实现了。用一个相对布局,里面放MapView和ImageView,ImageView处于MapView的中央位置,就这么搞定咯。

2.当用户拖拽地图时,如何监听地图的移动?

这个问题看着很简单,但我却觉得如果api选择错了,那就头痛了。

刚开始我用OnMapStatusChangeListener类来实现监听地图的移动,因为该类可以知道 "地图状态的改变原因、状态改变的过程(开始改变/正在改变/改变结束),使用这个类的话,要注意判断地图状态的改变原因,因为MapStatusUpdate相关类也是会触发该类。

由于OnMapStatusChangeListener类并不好控制,后面用OnMapTouchListener类将其替换,明显少了很多处理逻辑.

3.当地图被拖动时,如何获取中央覆盖物的地理坐标?

中央覆盖物是由于相对布局才处于MapView的中央,跟MapView只是层叠的关系,百度地图api中有个Projection类,用于屏幕像素点坐标系统和地球表面经纬度点坐标系统之间的变换,那我就尝试着获取ImageView的坐标,通过Projection类将屏幕坐标转换成地理坐标,刚开始试了确实可行;

后面发现地理坐标偏差较大,源于后面要通过中央覆盖物的地理坐标,获取到周边的数据,发现数据有问题,获取到的数据都不是中央覆盖物周边的。

后来在百度api文档中,翻到MapStatus这个类,这个类主要记录地图的状态,可以获取到地图操作的中心点、地图操作中心点在屏幕中的坐标等。由于覆盖物处于地图的中央,那么通过MapStatus获取到的中心地理坐标值,该值也就是该中心覆盖物的坐标。

4.如何通过中央覆盖物的地理坐标,获取到周边的POI数据?

刚开始是用周边检索功能来获取周边的POI数据,但周边检索功能必须设置keyword,那根据微信的功能实现,我并不能对keyword赋值,比如赋值 “大厦”,那获取到的数据都是关于周边大厦的。后来尝试着不用keyword来获取,但由于keyword的限制,也难以像微信一样。

后面在百度文档中找到GeoCoder这个类,可以通过地理坐标反地理编码,从而获取到周边的POI数据。

5.点击下边列表的某条数据,如何将中央覆盖物移至该数据对应的位置?

由于获取到的数据是带有地址信息和地理坐标的,可以通过MapStatusUpdate/MapStatusUpdateFactory,移动地图。这样就以中央覆盖物为参照物,而地图进行移动, 眼睛却察觉到是中央覆盖物移至该数据对应的位置.

6.发送定位时,对mapView进行截图,图中没有中央覆盖物?

使用百度api中的SnapshotReadyCallback类对mapView进行截图,所截取到的图中并没有中央覆盖物。这是由于中央覆盖物并不处于mapView这个控件中.

那么利用Android中View的截图方式,在mapView和中央覆盖物ImageView的父布局RelativeLayout外嵌套一层FrameLayout,对FrameLayout这个View进行截图呢?尝试了下,发现所截取的mapView是黑屏的,这就蓝瘦香菇了.

没办法,那就只能狸猫换太子咯。在点击发送定位时,将中央覆盖物隐藏,往地图中央添加marker覆盖物,然后再调用百度api进行截图.

其它

1.上面说的OnMapStatusChangeListener类并不好控制,其中1点看下面截图:

这里写图片描述

明明是手指触摸,在触发事件中,监听到的地图状态原因是开发者调用,这明显不对。写这篇文章时再测了下,并没再发现监听状态错误的问题,猜测可能是由于MapStatusUpdate等类引起的,具体的就不去深究咯.

2.获取ImageView的坐标,通过Projection类将屏幕坐标转换成地理坐标,偏差很大.下面截图中,地图中心点和中心覆盖物关于屏幕坐标、地理坐标的比较,这可能是因为地图并不是完全显示在手机屏幕的原因,导致偏差问题.

这里写图片描述

3.百度地图上面的签名跟apk的签名不一致,即sha1值错误

galaxy lib host missing meta-data,make sure you know the right way to integrate galaxy

这里写图片描述

链接

百度地图开发基础篇
百度地图开发的笔记(篇3)高仿微信发送位置功能

GitHub链接

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值