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

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

首先看下效果图:

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

主要功能(参照微信发送定位):

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

主要问题及解决

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

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

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

这种方法很明显,是不行的。后来参照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点看下面截图:

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

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

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

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

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

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

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