用高德sdk作一個滴滴司機端的導航地圖(自定義地圖導航界面)

用高德sdk作一個滴滴司機端的導航。

主要的導航功能是在NaviFragment中。html

效果以下:java

image

下載apk:下載地址git

掃一掃下載apkgithub

image

第一步:集成高德sdk

請看這篇文章 集成Android高德SDK數組

第二步:四個重要的類

1.AMapNaviView 導航地圖控件,導航路線都是在這個上面繪製的app

//AMapNaviView一些重要方法
    //獲取繪製路線所需的Amap類。
    AMapNaviView.getMap()。
    
    //AMapNaviView有生命週期方法 須要咱們和Activity或者Fragment的生命週期保持一致。
    //在Activity的onCreate調用 在Fragment的onViewCreate調用
    AMapNaviView.onCreate(savedInstanceState)。
    
    //在Activity或者Fragment的onResume中調用
    AMapNaviView.onResume();   
    
    //在Activity或者Fragment的onPause中調用
    AMapNaviView.onPause(); 

    //在Activity或者Fragment的onDestory中調用
   // 提示:AMapNaviView是沒有onStop方法的,因此不用寫。
    AMapNaviView.onDestory();

2. RouteOverLay 用來在AMapNaviView上繪製導航的路線的類ide

//RouteOverLay一些重要方法
   //根據數據建立一個RouteOverLay
   RouteOverLay routeOverLay = new RouteOverLay(Amap, AMapNaviPath, Context);
   //添加到地圖上。
   RouteOverLay.addToMap();

3. AMapNavi 導航功能類。(這個類是單例模式的)debug

//主要用來發起導航,能夠向AMapNavi設置監聽器監聽導航中一些信息回調
    //AMapNavi一些重要方法 
    //計算駕車路徑(包含起點)。
    AMapNavi.calculateDriveRoute(from, to,wayPoints,strategy); 
    // 添加導航事件回調監聽。
    AMapNavi.addAMapNaviListener(listener);
    //開始導航。
    AMapNavi.startNavi(type);

4. AMapNaviListener 導航信息監聽類code

//能夠經過AMapNavi.addAMapNaviListener(AMapNaviListener)
    //AMapNaviListener有不少回調方法。這裏介紹兩個很是重要的回調方法。

    //路線計算成功的回調方法。咱們須要在這裏作繪製導航路線。
    public void onCalculateRouteSuccess(AMapCalcRouteResult aMapCalcRouteResult)
    {
        
    }
    //路線計算失敗的回調方法。咱們須要在這裏失敗的邏輯  好比顯示一個按鈕 告訴用戶重試,重試也是調用AMapNavi.calculateDriveRoute(); 
    public void onCalculateRouteFailure(AMapCalcRouteResult aMapCalcRouteResult){
        
    }

四種觸發AMapNaviListener的回調方法onCalculateRouteSuccess 或onCalculateRouteFailure的狀況htm

  • 第一種狀況: 咱們主動調用AMapNavi.calculateDriveRoute()方法。前面已經介紹過了。

  • 第二種狀況: 咱們主動調用AMapNavi.switchParallelRoad()方法。(切換主路或輔路) AMapNaviListener 能夠經過notifyParallelRoad(int parallelRoadType)告訴咱們是在主路仍是在輔路上。

  • 第三種狀況: SDK內部經過AMapNaviListener的回調方法onReCalculateRouteForYaw()通知咱們準備開始偏航了從新計算路線, 這個時候也回調onCalculateRouteSuccess或onCalculateRouteFailure。

  • 第四種狀況: SDK內部經過AMapNaviListener的回調方法onReCalculateRouteForTrafficJam()方法通知咱們準備開始擁堵從新計算路線, 這個時候也會回調onCalculateRouteSuccess或onCalculateRouteFailure。 (很是擁堵從新計算路線這種況其實很是少見)

第三步: 如何使用這4個類。先寫個簡單的流程。

//獲取AMapNaviView地圖view
    AMapNaviView naviView=findViewById(R.id.naviView);
    AMapNaviViewOptions options = naviView.getViewOptions();


    //關閉自動繪製路線(若是你想自行繪製路線的話,必須關閉!!!)很是重要
    options.setAutoDrawRoute(false);
    //設置導航UI是否顯示
    options.setLayoutVisible(false);
    
    //從新設置一下。
    naviView.setViewOptions(options);


    mAMapNavi=AMapNavi.getInstance(getContext);
   //向AMapNavi設置監聽器。
    mAMapNavi.addAMapNaviListener(new AMapNaviListener() {
        @Override
        public void onCalculateRouteSuccess(AMapCalcRouteResult aMapCalcRouteResult) {
            //返回路線成功 這裏經過AMapCalcRouteResult繪製路線
            
            //獲取RouteOverLay所須要的Amap 若是要把路線繪製到AMapNaviView 請獲取AMapNaviView的Amap
            aMap= AMapNaviView.getMap()
            
            //獲取返回路線的數組routIDs aMapCalcRouteResult會返回一條或者多條路線。
            //ps:多條路線是用來作多路線選擇的功能可是這裏咱們只作簡單導航。因此咱們只繪製一條。
            int[] routIds = aMapCalcRouteResult.getRouteid();
            int routeId=routIds[0].
            //經過routeId獲取AMapNaviPath數據。
            AMapNaviPath aMapNaviPath=AMapNavi.getNaviPaths().get(routeId);
            //而後就能夠建立RouteOverLay了
            RouteOverLay routeOverLay = new RouteOverLay(aMap, aMapNaviPath, context);
            
            
            
            //添加到AMapNaviView上。
            routeOverLay.addToMap();
            
            
            //繪製路線成功後。調用startNavi開始導航。
            //固然你也能夠在別的地方調用  AMapNavi.startNavi(); //可是必定要在onCalculateRouteSuccess以後調用。
            mAMapNavi.startNavi();
    
        }

        @Override
        public void onCalculateRouteFailure(AMapCalcRouteResult aMapCalcRouteResult) {
            //路線計算失敗的回調方法。咱們須要在這裏作失敗的邏輯  好比顯示一個按鈕 告訴用戶重試,重試也是從新調用AMapNavi.calculateDriveRoute(); 
            ....
        }
        
    })
    
     //計算駕車路徑(包含起點)。會回調 onCalculateRouteSuccess或 onCalculateRouteFailure方法。
     AMapNavi.calculateDriveRoute();

第四步: 導航信息的顯示

導航信息:包括剩餘千米 預估時間等 須要咱們展示出來以下圖。

Alt text

其實這些信息咱們只須要到 AMapNaviListener 去實現 onNaviInfoUpdate(NaviInfo naviInfo) 就能夠拿到

代碼以下:

public void onNaviInfoUpdate(NaviInfo naviInfo) {
        if (null != naviInfo) {
            //獲取當前路段剩餘距離
            int distance =naviInfo.getCurStepRetainDistance();
            //下一個街道名稱
            String roadName = naviInfo.getNextRoadName();
            //獲取路線剩餘距離(總的路程剩餘距離)
            int allDitance =naviInfo.getPathRetainDistance(); 
            //獲取路線剩餘時間(總的路程剩餘時間)
            String allTime = naviInfo.getPathRetainTime()
        
            //獲取導航轉向圖標類型
            int iconType=naviInfo.getIconType()
        }

實景圖與模型圖。

什麼是實景圖和模型圖看下面的圖片你們就明白了

image

實景圖和模型圖的也是 須要在AMapNaviListener 中實現下面的方法就能夠實現了

首先咱們須要在
    AMapNaviViewOptions options = getNaviView().getViewOptions();
    //設置是否自動顯示模型圖 這裏咱們設置爲false 
    options.setModeCrossDisplayShow(false);
    AMapNaviView.setViewOptions(options);
    
    @Override
    public void showCross(AMapNaviCross aMapNaviCross) {
        //實景圖顯示 回調

        //展現實景圖
        zmLittleInIntersectionView.setImageBitmap(aMapNaviCross.getBitmap());


    }

    @Override
    public void hideCross() {
        //實景圖隱藏 回調
  
       
    }

    @Override
    public void showModeCross(AMapModelCross aMapModelCross) {
     
        //模型圖顯示  回調

        //展現模型圖
        modeCrossOverlay.createModelCrossBitMap(aMapModelCross.getPicBuf1(), new AMapModeCrossOverlay.OnCreateBitmapFinish() {
            @Override
            public void onGenerateComplete(Bitmap bitmap, int i) {
                zmLittleInIntersectionView.setImageBitmap(bitmap);
            }
        });

    }

    @Override
    public void hideModeCross() {
    
        //模型圖隱藏 回調
        
    }

鎖定自車與全覽。

什麼是鎖定自車和全覽

請看下圖:

image

能夠看到 當咱們點擊全覽按鈕的時候調用 displayOverview()方法 從鎖定自車模式進入了全覽路線的模式 點擊定位按鈕的時候 調用 recoverLockMode()方法進入鎖車模式

方法以下

//恢復鎖車狀態:用於用戶主動恢復以前的導航鎖車狀態(好比從全覽畫面,挪動地圖後畫面返回)
    AMapNaviView.recoverLockMode();
         
  
    //全覽能夠經過下面的方式設置全覽方法的上下左右的範圍
    AMapNaviViewOptions options = getNaviView().getViewOptions();
    RouteOverlayOptions routeOverlayOptions = new RouteOverlayOptions();
    //int left, int top, int right, int bottom
    routeOverlayOptions.setRect(new Rect(100, 400, 100, 100));
    options.setRouteOverlayOptions(routeOverlayOptions);
    AMapNaviView.setViewOptions(options);
    //
    
    //全覽模式  展現全覽:成功算路得到路徑以後,可將地圖縮放到徹底展現該路徑
    AMapNaviView.displayOverview();

導航路線上箭頭和走過的灰色路線。

請看下圖:

image

這兩個效果的實現都要使用 RouteOverLay中的drawArrow方法和 updatePolyline方法 而且要與AMapNaviListener 中的 onNaviInfoUpdate(NaviInfo naviInfo), onLocationChange(AMapNaviLocation aMapNaviLocation)
配合使用

代碼以下:

@Override
    public void onNaviInfoUpdate(NaviInfo naviInfo) {
        List<NaviLatLng> naviLatLngList = routeOverLay.getArrowPoints(naviInfo.getCurStep());
        //畫導航的箭頭。
        routeOverLay.drawArrow(naviLatLngList);
    }

    @Override
    public void onLocationChange(AMapNaviLocation aMapNaviLocation) {
        super.onLocationChange(aMapNaviLocation);
        //畫走過的灰色路線
        routeOverLay.updatePolyline(naviLocation);
    }

結束

在這裏我大概介紹完了整體流程,

其實還有一個切換主路輔路功能沒介紹,

固然還有不少細節問題,能夠看下代碼我寫了不少註釋。很簡單

高德導航sdk文檔

或者看下這個工程的代碼,主要代碼在NaviFragment中。

源碼github

謝謝你們

相關文章
相關標籤/搜索