Android 高德地图之自定义导航

匿名 (未验证) 提交于 2019-12-03 00:22:01

接着上一篇 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 你有两种方式去实现你想要的效果 一个是通过自定义地图进行多路线规划 一个是通过自定义导航设置途径点进行单路线绘画 但是高德导航并不会进行智能排序
你就需要有你的一套算法进行排序 本人近期已在研究路线规划之最短路线原则算法 下一期敬请期待
路线规划之最短路线原则算法和实现

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!