Appearance
专业导航
全屏导航面板 
开始导航需要先发起算路并且获取到路线信息,如何发起算路请参考路线规划说明。
1、添加导航信息监听
java
MapView mapView = findViewById(R.id.mapview);
mapView.getMap(didiMap -> {
DMapNavi dMapNavi = new DMapNavi(Context, DiMap);
// 添加导航信息回调监听
dMapNavi.addDMapNaviListener(DMapNaviListener);
// 添加主辅路、桥上桥下信息回调监听
dMapNavi.addParallelRoadListener(ParallelRoadListener);
... ...
}2、开始导航
当路径规划成功后,就可以调用dMapNavi.startNavi()发起导航。导航默认使用路径规划结果的第一条路线开始导航,如果想要使用其他路线发起导航,需要在调用dMapNavi.startNavi()之前调用dMapNavi.selectRoute()设置导航路线。
java
@Override
public void onCalculateRouteSuccess(DMapCalcRouteResult routeResult) {
Log.i(TAG, "onCalculateRouteSuccess:" + routeResult);
long[] routeIds = routeResult.getRouteId();
// 默认选中第一条路线,如果有多条路线,想设置设置第二条路线导航的话,startNavi之前设置路线id
if (routeIds != null && routeIds.length > 1) {
dMapNavi.selectRouteId(routeIds[1]);
}
dMapNavi.startNavi();
}3、导航视野
归位视野

全览视野

开发者可以通过设置dMapNavi.changeViewMode来改变导航中的视野,具体视野模式参考ViewMode类。开发者需要维护当前视野状态,点击按钮并相应的改变导航视野。
java
Button btnZoom;
boolean isFull3DMode = true;
btnZoom.setOnClickListener(v-> {
// 切换导航视野模式
isFull3DMode = !isFull3DMode;
dMapNavi.changeViewMode(isFull3DMode ? ViewMode.FULL_3D : ViewMode.FULL_2D);
btnZoom.setText(isFull3DMode ? "全览路线" : "退出全览");
})4、处理导航诱导信息回调

java
@Override
public void onNaviInfoUpdate(NaviInfo naviInfo) {
// 路线剩余时间
int remainTimeSecond = naviInfo.getPathRetainTime();
// 路线剩余距离
int remainDistance = naviInfo.getPathRetainDistance();
// 下一个路名
String nextRoadName = naviInfo.getNextRoadName();
// 转向icon
Bitmap turnIcon = naviInfo.getIconBitmap();
// 当前路段区间剩余距离
int nextDistance = naviInfo.getCurStepRetainDistance();
// 展示到导航诱导View上
... ...
}5、处理放大图回调

- 展示放大图
java
public void onShowCross(DMapNaviCross dMapNaviCross){
// 显示放大图View
if (dMapNaviCross != null) {
Drawable crossImageDrawable = dMapNaviCross.getDrawable();
}
}- 隐藏放大图
java
public void onHideCross(){
// 隐藏放大图View
}6、处理车道线回调

java
public void onShowLaneInfo(DMapLaneInfo laneInfo){
// 车道线展示逻辑参考DMapLaneInfo和demo LaneLineView
}7、处理主辅路、桥上桥下回调
导航提供平行主辅路、高架桥检测回调。以主辅路回调为例,当导航检测到当前存在主辅路,并且可能行驶在主路时,会回调notifyParallelRoad(roadStatus),此时roadStatus.getParallelRoadStatusFlag()是DMapNaviParallelRoadStatus.STATUS_MAIN_ROAD,这个时候可以展示主辅路按钮,如果车辆真实行驶在辅路,可以点击主辅路按钮调用 dMapNavi.switchParallelRoad(DMapParallelRoadType.TYPE_MAIN_SIDE_ROAD),通知导航引擎切换到辅路行驶。
java
Button btnMainSide;
btnMainSide.setOnClickListener(v-> {
// 切换主辅路状态
dMapNavi.switchParallelRoad(DMapParallelRoadType.TYPE_MAIN_SIDE_ROAD);
})
Button btnViaduct;
btnViaduct.setOnClickListener(v-> {
// 切换高架桥状态
dMapNavi.switchParallelRoad(DMapParallelRoadType.TYPE_VIADUCT_ROAD);
})
@Override
public void notifyParallelRoad(DMapNaviParallelRoadStatus roadStatus) {
Log.i(TAG, "notifyParallelRoad:" + roadStatus);
if (roadStatus.getElevatedRoadStatusFlag() == DMapNaviParallelRoadStatus.STATUS_MAIN_ROAD) {
// 当前行驶在桥上(可以调用DMapNavi.switchParallelRoad(DMapParallelRoadType.TYPE_VIADUCT_ROAD)切换桥上桥下状态)
btnViaduct.setVisibility(View.VISIBLE);
btnViaduct.setText("当前行驶在桥上/n点击切换到桥下");
} else if (roadStatus.getElevatedRoadStatusFlag() == DMapNaviParallelRoadStatus.STATUS_SIDE_ROAD) {
// 当前行驶在桥下(可以调用DMapNavi.switchParallelRoad(DMapParallelRoadType.TYPE_VIADUCT_ROAD)切换桥上桥下状态)
btnViaduct.setVisibility(View.VISIBLE);
btnViaduct.setText("当前行驶在桥下/n点击切换到桥上");
} else {
btnViaduct.setVisibility(View.GONE)
// 隐藏桥上桥下按钮
}
if (roadStatus.getParallelRoadStatusFlag() == DMapNaviParallelRoadStatus.STATUS_MAIN_ROAD) {
// 当前行驶在主路(可以调用DMapNavi.switchParallelRoad(DMapParallelRoadType.TYPE_MAIN_SIDE_ROAD)切换主辅路状态)
btnMainSide.setVisibility(View.VISIBLE);
btnMainSide.setText("当前行驶在主路/n点击切换到辅路");
} else if (roadStatus.getParallelRoadStatusFlag() == DMapNaviParallelRoadStatus.STATUS_SIDE_ROAD) {
// 当前行驶在辅路(可以调用DMapNavi.switchParallelRoad(DMapParallelRoadType.TYPE_MAIN_SIDE_ROAD)切换主辅路状态)
btnMainSide.setVisibility(View.VISIBLE);
btnMainSide.setText("当前行驶在辅路/n点击切换到主路");
} else {
// 隐藏主辅路按钮
btnMainSide.setVisibility(View.GONE);
}
}8、处理语音播报
需要自行调用三方语音播报,播报导航语音text。
java
public void onGetNavigationText(int type, String text) {
// ttsPlayer.playTts(text);
// 需要自行调用三方语音播报,播报导航语音text
}9、GPS信号回调
导航过程中会回调GPS状态变化,具体类型参考GpsType类。
java
public void onGpsSignalChanged(GpsType gpsType) {
}10、到达目的地
当导航到目的地附近时,会触发onArriveDestination回调。
java
public void onArriveDestination() {
}停止导航
退出导航时调用stopNavi结束导航。
java
dMapNavi.stopNavi();