在上一篇文章中,我们讲到了高德地图之拾取地点,今天接下来总结路线规划,整个实现的过程大致如下:
- 获取终点
- 规划路线
- 路线的选择与路线的绘制
- 路线结果的展示
首先来看看需要实现的效果:
整个布局比较简单,唯一需要注意的就是Tablayout的使用因为在在使用这个控件的时候栽过跟头,,先看看源码:
mTabLayout = (TabLayout) findViewById(R.id.tabs);
//tab的字体选择器,默认灰色,选择时白色
mTabLayout.setTabTextColors(Color.LTGRAY, Color.WHITE);
//设置tab的下划线颜色,默认是粉红色
mTabLayout.setSelectedTabIndicatorColor(Color.WHITE);
mTabLayout.addTab(mTabLayout.newTab().setText("驾车"));
mTabLayout.addTab(mTabLayout.newTab().setText("步行"));
mTabLayout.addTab(mTabLayout.newTab().setText("骑车"));
因为我当时在使用的过程中,因为增加了其它的属性,导致Tablayout的tab不能这样占满屏宽,要么是tab剧中显示,要么是居左显示,后来删除所有的属性后,直接现在这个样式了。
接下来开始总结我们上面实现的过程。
一、获取终点:
这个其实已经很简单了,因为我们上一次已经实现了高德地图之拾取地点,所以这里在点击目的地的EditText的时候调用该Activity即可,代码如下:
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.rl_tv_end:
Intent intent = new Intent(this,PiclocationActivity.class);//拾取坐标点
startActivityForResult(intent,0);
endList.clear();
break;
}
}
/**
* 获取终点信息
* @param requestCode
* @param resultCode
* @param intent
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if(resultCode==RESULT_OK){
tvEnd.setText("到 "+intent.getStringExtra("address"));
LatLonPoint endLp = intent.getParcelableExtra("value");
endList.clear();
endList.add(new NaviLatLng(endLp.getLatitude(),endLp.getLongitude()));
}
}
在获取终点的过程中,我们先是将终点的坐标集合清空,然后将最新的坐标点保存到集合中,并将目的地地址显示出来。
二 、规划路线:
在实现规划路线的时候,我们需要获取一个AMapNavi对象,然后实现一个导航事件监听接口——AMapNaviListener。这个接口有许多抽象方法,但是我们必须要实现的有两个方法——路线规划成功以后回调规划结果:
/**
* 初始化AMap对象
*/
private void initMap() {
if (amap == null) {
...
mAMapNavi = AMapNavi.getInstance(getApplicationContext());
mAMapNavi.addAMapNaviListener(this);
}
}
//多路线算路成功回调
onCalculateMultipleRoutesSuccess(int[] routeIds)
//步行,驾车,骑行路径规划成功后的回调函数。(单条路线)
onCalculateRouteSuccess()
//步行或者驾车路径规划失败后的回调函数。
onCalculateRouteFailure(int errorInfo)
在重写上面的接口回调函数之前,我们需要先实现路线规划,因为回调函数都是成功或者失败的处理方法,所以我们先去规划,规划了以后再来重写结果的函数。
因为驾车、步行、骑行等路线的规划都是不同的函数,而且我们都需要实现,所以我们需要增加一个int值的flag,来标识不同的路线规划,该标识默认为驾车。接下来我们看看路线规划的函数:
/**
* 方法必须重写
*/
@Override
protected void onResume() {
super.onResume();
mapview.onResume();
planRoute();//路线规划
}
/**
* 路线规划
*/
private void planRoute() {
mRecyclerView.setVisibility(View.GONE);//多条路线规划结果
oneWay.setVisibility(View.GONE);//一条路线规划结果
if(startList.size()>0 && endList.size()>0){
if(navigationType == 0){
//驾车
int strategy=0;
try {
/**
* 方法:
* int strategy=mAMapNavi.strategyConvert(congestion, avoidhightspeed, cost, hight