Android 高德地图之自定义导航

接着上一篇 https://blog.csdn.net/naide_s/article/details/80547320 自定义地图 继续写自定义导航

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

首先看一下 效果

高德提供的导航页面

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

再看一下 我需要的

我需要的效果图

转向提示

一般路线纹路提示

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

/**
* 思路
*
* 初始化基础地图
* 初始化导航
* 规划路线
* 创建导航图层 并添加规划好的路线
* 自定义需要的一些属性 和 功能 去除高德提供的一些不重要的图层信息
* 将路线添加到地图并开始导航
*
*/

直接上代码

/* 思路 * * 初始化基础地图 * 初始化导航 * 规划路线 * 创建导航图层 并添加规划好的路线 *
自定义需要的一些属性 和 功能 去除高德提供的一些不重要的图层信息 * 将路线添加到地图并开始导航 * */ public class
AMapRouteActivity extends Activity implements AMapNaviViewListener,
AMapNaviListener {

private AMapNaviView navi_map;
private AMapNavi aMapNavi;
private List<NaviLatLng> startPointList = new ArrayList<>();// 起点的集合
private List<NaviLatLng> endPointList = new ArrayList<>(); // 终点的集合
private List<NaviLatLng> 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.getResources(),

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(AimLessModeCongestionInfo

aimLessModeCongestionInfo) {

}
// 行车监听
@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 你有两种方式去实现你想要的效果 一个是通过自定义地图进行多路线规划 一个是通过自定义导航设置途径点进行单路线绘画 但是高德导航并不会进行智能排序
你就需要有你的一套算法进行排序 本人近期已在研究路线规划之最短路线原则算法 下一期敬请期待
路线规划之最短路线原则算法和实现

猜你喜欢

转载自blog.csdn.net/naide_s/article/details/80579025