Android 高德地图之自定义导航

接着上一篇 自定义地图   自定义地图 继续写自定义导航

高德地图就不写了 官方文档有的 自己去看好了 写的比我好 简单清晰

首先看一下 效果


效果01

可以看出 功能很齐全 但并不是我们想要的

再看一下 我需要的

效果02


效果03


效果04

到这里以后 我就说一下思路

/** 

* 思路 

* 初始化基础地图 

* 初始化导航 

* 规划路线 

* 创建导航图层 并添加规划好的路线 

* 自定义需要的一些属性 和 功能 去除高德提供的一些不重要的图层信息 

* 将路线添加到地图并开始导航 

*/

直接上代码

/思路 * * 初始化基础地图 * 初始化导航 * 规划路线 * 创建导航图层 并添加规划好的路线 * 

自定义需要的一些属性 和 功能 去除高德提供的一些不重要的图层信息 * 将路线添加到地图并开始导航 * */ 


 public class 

AMapRouteActivity extends Activity implements AMapNaviViewListener, 

AMapNaviListener {

private AMapNaviView navi_map;

private AMapNavi aMapNavi;

private List startPointList = new ArrayList<>();// 起点的集合

private List endPointList = new ArrayList<>(); // 终点的集合

private List wayPointList = new ArrayList<>(); // 途径点的集合

@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_amaproute);

    // 初始化地图并创建地图

    navi_map = (AMapNaviView) findViewById(R.id.navi_map);

    navi_map.setAMapNaviViewListener(this);

    navi_map.onCreate(savedInstanceState);

    // 获取地图属性 并设置相关属性

    AMapNaviViewOptions options = navi_map.getViewOptions();

    // 关闭高德提供的导航图层

    options.setLayoutVisible(false);

    // 关闭高德提供的导航路线绘制

    options.setAutoDrawRoute(false);

    // 设置自车位置

    options.setCarBitmap(BitmapFactory.decodeResource(this.getResources(),R.mipmap.map_owner_img));

    // 设置导航属性

    navi_map.setViewOptions(options);

    initAMapNavi();

    // 添加导航路线 起点 终点 途径点

    NaviLatLng start = new NaviLatLng();

    NaviLatLng end = new NaviLatLng();

    NaviLatLng way1 = new NaviLatLng();

    NaviLatLng way2 = new NaviLatLng();

    start.setLatitude(30.291779);

    start.setLongitude(120.040998);

    startPointList.add(start);

    end.setLatitude(30.406169);

    end.setLongitude(120.305117);

    endPointList.add(end);

    way1.setLatitude(30.270999);

    way1.setLongitude(120.163277);

    way2.setLatitude(30.291124);

    way2.setLongitude(120.212892);

    wayPointList.add(way1);

    wayPointList.add(way2);

}

//初始化导航对象

private void initAMapNavi() {

    aMapNavi = AMapNavi.getInstance(getApplicationContext());

    aMapNavi.addAMapNaviListener(this);

}

// 重写地图的生命周期与activity 同步

@Override

protected void onResume() {

    super.onResume();

    navi_map.onResume();

}

@Override

protected void onPause() {

    super.onPause();

    navi_map.onPause();

}

@Override

protected void onDestroy() {

    super.onDestroy();

    navi_map.onDestroy();

}

@Override

public void onNaviSetting() {

}

// 取消导航监听

@Override

public void onNaviCancel() {

}

// 推出导航监听

@Override

public boolean onNaviBackClick() {

    return false;

}

@Override

public void onNaviMapMode(int i) {

}

@Override

public void onNaviTurnClick() {

}

@Override

public void onNextRoadClick() {

}

@Override

public void onScanViewButtonClick() {

}

@Override

public void onLockMap(boolean b) {

}

@Override

public void onNaviViewLoaded() {

}

@Override

public void onInitNaviFailure() {

    // 路线规划对象初始化失败

}

@Override

public void onInitNaviSuccess() {

    // 路线规划对象初始化成功

    /**

    * 方法:

    *  int strategy=mAMapNavi.strategyConvert(congestion, avoidhightspeed, cost, hightspeed, multipleroute);

    * 参数:

    * @congestion 躲避拥堵

    * @avoidhightspeed 不走高速

    * @cost 避免收费

    * @hightspeed 高速优先

    * @multipleroute 多路径

    *

    * 说明:

    *      以上参数都是boolean类型,其中multipleroute参数表示是否多条路线,如果为true则此策略会算出多条路线。

    * 注意:

    *      不走高速与高速优先不能同时为true

    *      高速优先与避免收费不能同时为true

    */

    int i = 0;

    try{

        // 设置属性

        i = aMapNavi.strategyConvert(true, false, false, false, false);

    }catch (Exception e){

        e.printStackTrace();

    }

    /**

    * 驾车路线规划

    * startPointList 起点经纬度

    * endPointList  终点经纬度

    * wayPointList  途径点经纬度

    * i              路线规划属性

    */

    aMapNavi.calculateDriveRoute(startPointList,endPointList,wayPointList,i);

}

// 开始导航

@Override

public void onStartNavi(int i) {

}

@Override

public void onTrafficStatusUpdate() {

}

// 位置变化监听

@Override

public void onLocationChange(AMapNaviLocation aMapNaviLocation) {

}

@Override

public void onGetNavigationText(int i, String s) {

}

@Override

public void onEndEmulatorNavi() {

}

@Override

public void onArriveDestination() {

}

@RequiresApi(api = Build.VERSION_CODES.KITKAT)

@Override

public void onCalculateRouteSuccess() {

    // 路线规划成功回调

    /**

    * 创建导航图层对象 并设置地图对象 规划成功后的路线 以及导航监听

    */

    RouteOverLay routeOverlay = new RouteOverLay(navi_map.getMap(), aMapNavi.getNaviPath(), this);

    //设置起点的图标

    routeOverlay.setStartPointBitmap(BitmapFactory.decodeResource(this.getResourse.R.mipmap.map_start_img)); 

//设置终点的图标 

routeOverlay.setEndPointBitmap(BitmapFactory.decodeResource(this.getResources(), 

R.mipmap.map_end_img)); 

//设置途经点的图标 

View inflate = LayoutInflater.from(AppManager.getAppManager().currentActivity()).inflate(R.layout.map_custom_marker_img, 

null); 

RoundImageView roundImg = (RoundImageView) inflate.findViewById(R.id.map_custom_marker); 

roundImg.setImageBitmap(BitmapFactory.decodeResource(AppManager.getAppManager().currentActivity().getResources(),R.mipmap.map_passheand_one)); 

BitmapDescriptor bitmap = BitmapDescriptorFactory.fromBitmap(convertViewToBitmap(inflate)); 

Bitmap bitmap1 = bitmap.getBitmap(); 

routeOverlay.setWayPointBitmap(bitmap1); 

try { 

// 设置线宽 

routeOverlay.setWidth(60); 

} catch (AMapNaviException e) { 

//宽度须>0 

e.printStackTrace(); 

}

int color[] = new int[10];

    color[0] = Color.BLACK;

    color[1] = Color.RED;

    color[2] = Color.BLUE;

    color[3] = Color.YELLOW;

    color[4] = Color.GRAY;

    //以途径点的index分隔,用不同的颜色绘制路段

    routeOverlay.addToMap(color, aMapNavi.getNaviPath().getWayPointIndex());

    // 开启导航  NaviType.EMULATOR模拟导航  NaviType.GPS实时导航

    aMapNavi.startNavi(NaviType.EMULATOR);

}

/**

* view 转为 bitmap 对象

* @param view

* @return

*/

public static Bitmap convertViewToBitmap(View view) {

    view.destroyDrawingCache();

    view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),

            View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));

    view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());

    view.setDrawingCacheEnabled(true);

    return view.getDrawingCache(true);

}

@Override

public void onCalculateRouteFailure(int i) {

    // 路线规划失败

}

@Override

public void onReCalculateRouteForYaw() {

}

@Override

public void onReCalculateRouteForTrafficJam() {

}

// 途径点回调

@Override

public void onArrivedWayPoint(int i) {

}

//GPS是否开启

@Override

public void onGpsOpenStatus(boolean b) {

}

// 导航信息变化

@Override

public void onNaviInfoUpdate(NaviInfo naviInfo) {

}

@Override

public void onNaviInfoUpdated(AMapNaviInfo aMapNaviInfo) {

}

@Override

public void updateCameraInfo(AMapNaviCameraInfo[] aMapNaviCameraInfos) {

}

// 区域地图变化

@Override

public void onServiceAreaUpdate(AMapServiceAreaInfo[] aMapServiceAreaInfos) {

}

@Override

public void showCross(AMapNaviCross aMapNaviCross) {

}

@Override

public void hideCross() {

}

@Override

public void showLaneInfo(AMapLaneInfo[] aMapLaneInfos, byte[] bytes, byte[] bytes1) {

}

@Override

public void hideLaneInfo() {

}

@Override

public void onCalculateMultipleRoutesSuccess(int[] ints) {

}

@Override

public void notifyParallelRoad(int i) {

}

@Override

public void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo aMapNaviTrafficFacilityInfo) {

}

@Override

public void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo[] aMapNaviTrafficFacilityInfos) {

}

@Override

public void OnUpdateTrafficFacility(TrafficFacilityInfo trafficFacilityInfo) {

}

@Override

public void updateAimlessModeStatistics(AimLessModeStat aimLessModeStat) {

}

@Override

public void updateAimlessModeCongestionInfo(AimLessModeCongestionInfoaimLessModeCongestionInfo) {

}

// 行车监听

@Override

public void onPlayRing(int i) {

} }

注释写的很清楚 自己看就好了

如果这个图层的自定义程度 无法满足你的需求 你还可以 这样

/作者: Nade_S on 2018/6/5. * 绘制导航图层 可完全自定义导航图层 */

public class NaviRouteOverLay extends RouteOverLay { 

public NaviRouteOverLay(AMap aMap, AMapNaviPath aMapNaviPath, Context context) { 

super(aMap, aMapNaviPath, context); 

}

@Override

public void setWidth(float v) throws AMapNaviException {

    super.setWidth(v);

}

@Override

public RouteOverlayOptions getRouteOverlayOptions() {

    return super.getRouteOverlayOptions();

} }

完全自定义写一个导航图曾类 就好了 一定要先阅读源码 要不然会有你意想不到的惊喜

路线规划 并加载到地图 高德地图并不会自动给你排序 他会按照你提供的途径点顺序呈现在地图上 

所以如果你是多路线 按照以上方法 显示到地图上会很low 你有两种方式去实现你想要的效果 一个是通过自定义地图进行多路线规划 一个是通过自定义导航设置途径点进行单路线绘画 但是高德导航并不会进行智能排序 

你就需要有你的一套算法进行排序 本人近期已在研究路线规划之最短路线原则算法 下一期敬请期待 

路线规划之最短路线原则算法和实现

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352