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