接着上一篇 https://blog.csdn.net/naide_s/article/details/80547320 自定义地图 继续写自定义导航
高德地图就不写了 官方文档有的 自己去看好了 写的比我好 简单清晰
首先看一下 效果
可以看出 功能很齐全 但并不是我们想要的
再看一下 我需要的
到这里以后 我就说一下思路
/**
* ˼·
*
* 初始化基础地图
* 初始化导航
* 规划路线
* 创建导航图层 并添加规划好的路线
* 自定义需要的一些属性 和 功能 去除高德提供的一些不重要的图层信息
* 将路线添加到地图并开始导航
*
*/
直接上代码
/* 思路 * * 初始化基础地图 * 初始化导航 * 规划路线 * 创建导航图层 并添加规划好的路线 *
自定义需要的一些属性 和 功能 去除高德提供的一些不重要的图层信息 * 将路线添加到地图并开始导航 * */ public class
AMapRouteActivity extends Activity implements AMapNaviViewListener,
AMapNaviListener {private AMapNaviView navi_map; private AMapNavi aMapNavi; private List<NaviLatLng> startPointList = new ArrayList<>();// 起点的集合 private List<NaviLatLng> endPointList = new ArrayList<>(); // 终点的集合 private List<NaviLatLng> wayPointList = new ArrayList<>(); // 途径点的集合 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_amaproute); // 初始化地图并创建地图 navi_map = (AMapNaviView) findViewById(R.id.navi_map); navi_map.setAMapNaviViewListener(this); navi_map.onCreate(savedInstanceState); // 获取地图属性 并设置相关属性 AMapNaviViewOptions options = navi_map.getViewOptions(); // 关闭高德提供的导航图层 options.setLayoutVisible(false); // 关闭高德提供的导航路线绘制 options.setAutoDrawRoute(false); // 设置自车位置 options.setCarBitmap(BitmapFactory.decodeResource(this.getResources(),R.mipmap.map_owner_img)); // 设置导航属性 navi_map.setViewOptions(options); initAMapNavi(); // 添加导航路线 起点 终点 途径点 NaviLatLng start = new NaviLatLng(); NaviLatLng end = new NaviLatLng(); NaviLatLng way1 = new NaviLatLng(); NaviLatLng way2 = new NaviLatLng(); start.setLatitude(30.291779); start.setLongitude(120.040998); startPointList.add(start); end.setLatitude(30.406169); end.setLongitude(120.305117); endPointList.add(end); way1.setLatitude(30.270999); way1.setLongitude(120.163277); way2.setLatitude(30.291124); way2.setLongitude(120.212892); wayPointList.add(way1); wayPointList.add(way2); } //初始化导航对象 private void initAMapNavi() { aMapNavi = AMapNavi.getInstance(getApplicationContext()); aMapNavi.addAMapNaviListener(this); } // 重写地图的生命周期与activity 同步 @Override protected void onResume() { super.onResume(); navi_map.onResume(); } @Override protected void onPause() { super.onPause(); navi_map.onPause(); } @Override protected void onDestroy() { super.onDestroy(); navi_map.onDestroy(); } @Override public void onNaviSetting() { } // 取消导航监听 @Override public void onNaviCancel() { } // 推出导航监听 @Override public boolean onNaviBackClick() { return false; } @Override public void onNaviMapMode(int i) { } @Override public void onNaviTurnClick() { } @Override public void onNextRoadClick() { } @Override public void onScanViewButtonClick() { } @Override public void onLockMap(boolean b) { } @Override public void onNaviViewLoaded() { } @Override public void onInitNaviFailure() { // 路线规划对象初始化失败 } @Override public void onInitNaviSuccess() { // 路线规划对象初始化成功 /** * 方法: * int strategy=mAMapNavi.strategyConvert(congestion, avoidhightspeed, cost, hightspeed, multipleroute); * 参数: * @congestion 躲避拥堵 * @avoidhightspeed 不走高速 * @cost 避免收费 * @hightspeed 高速优先 * @multipleroute 多路径 * * 说明: * 以上参数都是boolean类型,其中multipleroute参数表示是否多条路线,如果为true则此策略会算出多条路线。 * 注意: * 不走高速与高速优先不能同时为true * 高速优先与避免收费不能同时为true */ int i = 0; try{ // 设置属性 i = aMapNavi.strategyConvert(true, false, false, false, false); }catch (Exception e){ e.printStackTrace(); } /** * 驾车路线规划 * startPointList 起点经纬度 * endPointList 终点经纬度 * wayPointList 途径点经纬度 * i 路线规划属性 */ aMapNavi.calculateDriveRoute(startPointList,endPointList,wayPointList,i); } // 开始导航 @Override public void onStartNavi(int i) { } @Override public void onTrafficStatusUpdate() { } // 位置变化监听 @Override public void onLocationChange(AMapNaviLocation aMapNaviLocation) { } @Override public void onGetNavigationText(int i, String s) { } @Override public void onEndEmulatorNavi() { } @Override public void onArriveDestination() { } @RequiresApi(api = Build.VERSION_CODES.KITKAT) @Override public void onCalculateRouteSuccess() { // 路线规划成功回调 /** * 创建导航图层对象 并设置地图对象 规划成功后的路线 以及导航监听 */ RouteOverLay routeOverlay = new RouteOverLay(navi_map.getMap(), aMapNavi.getNaviPath(), this); //设置起点的图标 routeOverlay.setStartPointBitmap(BitmapFactory.decodeResource(this.getResources(),
R.mipmap.map_start_img));
//设置终点的图标
routeOverlay.setEndPointBitmap(BitmapFactory.decodeResource(this.getResources(),
R.mipmap.map_end_img));
//设置途经点的图标
View inflate = LayoutInflater.from(AppManager.getAppManager().currentActivity()).inflate(R.layout.map_custom_marker_img,
null);
RoundImageView roundImg = (RoundImageView) inflate.findViewById(R.id.map_custom_marker);
roundImg.setImageBitmap(BitmapFactory.decodeResource(AppManager.getAppManager().currentActivity().getResources(),R.mipmap.map_passheand_one));
BitmapDescriptor bitmap = BitmapDescriptorFactory.fromBitmap(convertViewToBitmap(inflate));
Bitmap bitmap1 = bitmap.getBitmap();
routeOverlay.setWayPointBitmap(bitmap1);
try {
// 设置线宽
routeOverlay.setWidth(60);
} catch (AMapNaviException e) {
//宽度须>0
e.printStackTrace();
}int color[] = new int[10]; color[0] = Color.BLACK; color[1] = Color.RED; color[2] = Color.BLUE; color[3] = Color.YELLOW; color[4] = Color.GRAY; //以途径点的index分隔,用不同的颜色绘制路段 routeOverlay.addToMap(color, aMapNavi.getNaviPath().getWayPointIndex()); // 开启导航 NaviType.EMULATOR模拟导航 NaviType.GPS实时导航 aMapNavi.startNavi(NaviType.EMULATOR); } /** * view 转为 bitmap 对象 * @param view * @return */ public static Bitmap convertViewToBitmap(View view) { view.destroyDrawingCache(); view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); view.setDrawingCacheEnabled(true); return view.getDrawingCache(true); } @Override public void onCalculateRouteFailure(int i) { // 路线规划失败 } @Override public void onReCalculateRouteForYaw() { } @Override public void onReCalculateRouteForTrafficJam() { } // 途径点回调 @Override public void onArrivedWayPoint(int i) { } //GPS是否开启 @Override public void onGpsOpenStatus(boolean b) { } // 导航信息变化 @Override public void onNaviInfoUpdate(NaviInfo naviInfo) { } @Override public void onNaviInfoUpdated(AMapNaviInfo aMapNaviInfo) { } @Override public void updateCameraInfo(AMapNaviCameraInfo[] aMapNaviCameraInfos) { } // 区域地图变化 @Override public void onServiceAreaUpdate(AMapServiceAreaInfo[] aMapServiceAreaInfos) { } @Override public void showCross(AMapNaviCross aMapNaviCross) { } @Override public void hideCross() { } @Override public void showLaneInfo(AMapLaneInfo[] aMapLaneInfos, byte[] bytes, byte[] bytes1) { } @Override public void hideLaneInfo() { } @Override public void onCalculateMultipleRoutesSuccess(int[] ints) { } @Override public void notifyParallelRoad(int i) { } @Override public void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo aMapNaviTrafficFacilityInfo) { } @Override public void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo[] aMapNaviTrafficFacilityInfos) { } @Override public void OnUpdateTrafficFacility(TrafficFacilityInfo trafficFacilityInfo) { } @Override public void updateAimlessModeStatistics(AimLessModeStat aimLessModeStat) { } @Override public void updateAimlessModeCongestionInfo(AimLessModeCongestionInfo
aimLessModeCongestionInfo) {
} // 行车监听 @Override public void onPlayRing(int i) { } }
注释写的很清楚 自己看就好了
如果这个图层的自定义程度 无法满足你的需求 你还可以 这样
/* 作者: Nade_S on 2018/6/5. * 绘制导航图层 可完全自定义导航图层 */
public class NaviRouteOverLay extends RouteOverLay {
public NaviRouteOverLay(AMap aMap, AMapNaviPath aMapNaviPath, Context context) {
super(aMap, aMapNaviPath, context);
}@Override public void setWidth(float v) throws AMapNaviException { super.setWidth(v); } @Override public RouteOverlayOptions getRouteOverlayOptions() { return super.getRouteOverlayOptions(); } }
完全自定义写一个导航图曾类 就好了 一定要先阅读源码 要不然会有你意想不到的惊喜
路线规划 并加载到地图 高德地图并不会自动给你排序 他会按照你提供的途径点顺序呈现在地图上
所以如果你是多路线 按照以上方法 显示到地图上会很low 你有两种方式去实现你想要的效果 一个是通过自定义地图进行多路线规划 一个是通过自定义导航设置途径点进行单路线绘画 但是高德导航并不会进行智能排序
你就需要有你的一套算法进行排序 本人近期已在研究路线规划之最短路线原则算法 下一期敬请期待
路线规划之最短路线原则算法和实现