Android studio 百度地图开发(7)overlayManager、overlayutil应用
开发环境:win7 64位,Android Studio,请注意是Android Studio;
+导航SDK版本:3.1.0+地图SDK版本:3.7.3+定位SDK版本:6.2.3
百度地图开发系列文章:
- 百度地图应用(1):Android studio 百度地图开发(1)配置工程、显示地图
- 百度地图应用(2):Android studio 百度地图开发(2)地图定位
- 百度地图应用(3):Android studio 百度地图开发(3)地图导航
-
百度地图应用(4):Android studio 百度地图开发(4)触摸选点、地理编码
- 百度地图应用(5):Android studio 百度地图开发(5)查询周边服务(加油站)
- 百度地图应用(6):Android studio 百度地图开发(6)Marker绑定事件、计算两点距离
一.问题引入
该部分内容还是属于导航部分的应用,例如《Android studio 百度地图开发(3)地图导航》。只是应用(3)里使用的是百度官方导航Demo:有起点和终点后,直接进入导航模式,而不会先展示规划路径,然后点击导航才正式进入导航模式。可能有时候我们也有这样的需求:在地图上选择起点和终点后,需要给出几种规划方案供我们选择,比如:躲避拥堵、时间最少、少换乘等等;另外一点,我们可能需要在地图上展示出这些规划方案,也就是在地图上添加路径图层,此时就需要用到overlay以及其子类DrivingRouteOverlay等等。
But,问题就随之而来。为了实现这个需求,ask度娘,就会查到很多现成的导航例子,但是这些例子所使用的SDK版本都比较旧了,使用较新的SDK+别人的代码或者是官方Demo,都会出现问题,那就是找不到PoiOverlay、TransitRouteOverlay、WalkingRouteOverlay、BusLineOverlay、DrivingRouteOverlay等等,为什么呢?因为从SDK3.6.0以后,这些类代码已经放在了源码包:com.baidu.mapapi.overlayutil中,而overlayutil源码包并没有在3.6.0之后的SDK中。
二.解决方法
既然问题是这样的,那就只能自己将官方的overlayutil整合到自己的工程里了。为了减少需要改动的地方,我们需要在自己的工程里再新建一个包,用来放置官方的overlayutil相关代码,步骤如下。
1)先下载官方的overlayutil和clusterutil。
下载地址1:点击下载【推荐,附带使用说明的文档】
下载地址2:点击下载【下载示例代码】
2)使用方法
①如果是使用下载地址1:解压后按照方法.txt即可
②如果是下载方法2:
解压后,源码路径为:BaiduMap_AndroidMapSDK_v3.7.1_Sample\BaiduMapsApiDemo\src\com\baidu\mapapi
然后:1)方式一:在工程的../java目录下新建com->baidu->mapapi,然后将clusterutil和overlayutil复制进去就可以;
2)方式二:直接将src/下的整个com文件复试到工程的java目录下。
最终的样子:
然后就可以正常使用规划路径图层了,关于图层的添加方法和类设计《点击查看,一定要看》:
route = result.getRouteLines().get(0);
DrivingRouteOverlay overlay = new DrivingRouteOverlay(mBaidumap);
//routeOverlay = overlay;
mBaidumap.setOnMarkerClickListener(overlay);
overlay.setData(result.getRouteLines().get(0));
overlay.addToMap();
overlay.zoomToSpan();
2016年12月19日补充:
关于“IconGenerator类引用的text_bubble不存在”的问题,我已经很久没做这块了,所以不确定是否一定需要。如果有需要的朋友,解决方法:
layout文件夹下新建一个text_bubble.xml,添加代码:
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2015 Baidu, Inc. All Rights Reserved.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.baidu.mapapi.clusterutil.ui.RotationLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:paddingBottom="5dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="5dp"/>
</com.baidu.mapapi.clusterutil.ui.RotationLayout>
</LinearLayout>