主要的導航功能是在NaviFragment中。html
效果以下:java
下載apk:下載地址git
掃一掃下載apkgithub
請看這篇文章 集成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。 (很是擁堵從新計算路線這種況其實很是少見)
//獲取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();
導航信息:包括剩餘千米 預估時間等 須要咱們展示出來以下圖。
其實這些信息咱們只須要到 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() }
什麼是實景圖和模型圖看下面的圖片你們就明白了
實景圖和模型圖的也是 須要在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() { //模型圖隱藏 回調 }
什麼是鎖定自車和全覽
請看下圖:
能夠看到 當咱們點擊全覽按鈕的時候調用 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();
請看下圖:
這兩個效果的實現都要使用 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); }
在這裏我大概介紹完了整體流程,
其實還有一個切換主路輔路功能沒介紹,
固然還有不少細節問題,能夠看下代碼我寫了不少註釋。很簡單
或者看下這個工程的代碼,主要代碼在NaviFragment中。
謝謝你們