Skip to content

专业导航

全屏导航面板

开始导航前需要先发起算路并获取路线信息。发起算路的方法请参考路线规划

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();