⑦ 骑行路线详情
在RouteActivity中找到onRideRouteSearched方法,方法里面添加如下代码:
代码语言:javascript复制 tvTime.setText(des);
bottomLayout.setVisibility(View.VISIBLE);
bottomLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(RouteActivity.this,
RouteDetailActivity.class);
intent.putExtra("type",1);
intent.putExtra("path", ridePath);
startActivity(intent);
}
});
在这里插入图片描述
然后在adapter包下新增一个RideSegmentListAdapter类,里面的代码如下;
代码语言:javascript复制package com.llw.mapdemo.adapter;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.amap.api.services.route.RideStep;
import com.amap.api.services.route.WalkStep;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.llw.mapdemo.R;
import com.llw.mapdemo.util.MapUtil;
import java.util.List;
/**
* 骑行段列表适配器
*
* @author llw
* @date 2021/2/23 10:25
*/
public class RideSegmentListAdapter extends BaseQuickAdapter<RideStep, BaseViewHolder> {
private List<RideStep> mItemList;
public RideSegmentListAdapter(int layoutResId, @Nullable List<RideStep> data) {
super(layoutResId, data);
mItemList = data;
}
@Override
protected void convert(BaseViewHolder helper, RideStep item) {
TextView lineName = helper.getView(R.id.bus_line_name);
ImageView dirIcon = helper.getView(R.id.bus_dir_icon);
ImageView dirUp = helper.getView(R.id.bus_dir_icon_up);
ImageView dirDown = helper.getView(R.id.bus_dir_icon_down);
ImageView splitLine = helper.getView(R.id.bus_seg_split_line);
if (helper.getAdapterPosition() == 0) {
dirIcon.setImageResource(R.drawable.dir_start);
lineName.setText("出发");
dirUp.setVisibility(View.INVISIBLE);
dirDown.setVisibility(View.VISIBLE);
splitLine.setVisibility(View.INVISIBLE);
} else if (helper.getAdapterPosition() == mItemList.size() - 1) {
dirIcon.setImageResource(R.drawable.dir_end);
lineName.setText("到达终点");
dirUp.setVisibility(View.VISIBLE);
dirDown.setVisibility(View.INVISIBLE);
} else {
splitLine.setVisibility(View.VISIBLE);
dirUp.setVisibility(View.VISIBLE);
dirDown.setVisibility(View.VISIBLE);
String actionName = item.getAction();
int resID = MapUtil.getWalkActionID(actionName);
dirIcon.setImageResource(resID);
lineName.setText(item.getInstruction());
}
}
}
下面再进入到RouteDetailActivity,新增如下方法:
代码语言:javascript复制 /**
* 骑行详情
* @param intent
*/
private void rideDetail(Intent intent) {
tvTitle.setText("骑行路线规划");
RidePath ridePath = intent.getParcelableExtra("path");
String dur = MapUtil.getFriendlyTime((int) ridePath.getDuration());
String dis = MapUtil.getFriendlyLength((int) ridePath.getDistance());
tvTime.setText(dur "(" dis ")");
rv.setLayoutManager(new LinearLayoutManager(this));
rv.setAdapter(new RideSegmentListAdapter(R.layout.item_segment, ridePath.getSteps()));
}
然后在initView中调用
在这里插入图片描述
然后你就可以运行了。
在这里插入图片描述
⑧ 驾车路线详情
在RouteActivity中找到onRideRouteSearched方法,方法里面添加如下代码:
代码语言:javascript复制 tvTime.setText(des);
bottomLayout.setVisibility(View.VISIBLE);
bottomLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(RouteActivity.this,
RouteDetailActivity.class);
intent.putExtra("type",2);
intent.putExtra("path", drivePath);
startActivity(intent);
}
});
在这里插入图片描述
然后在adapter包下新增一个DriveSegmentListAdapter类,里面的代码如下;
代码语言:javascript复制package com.llw.mapdemo.adapter;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.amap.api.services.route.DriveStep;
import com.amap.api.services.route.RideStep;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.llw.mapdemo.R;
import com.llw.mapdemo.util.MapUtil;
import java.util.List;
/**
* 驾车段列表适配器
*
* @author llw
* @date 2021/2/23 11:18
*/
public class DriveSegmentListAdapter extends BaseQuickAdapter<DriveStep, BaseViewHolder> {
private List<DriveStep> mItemList;
public DriveSegmentListAdapter(int layoutResId, @Nullable List<DriveStep> data) {
super(layoutResId, data);
mItemList = data;
}
@Override
protected void convert(BaseViewHolder helper, DriveStep item) {
TextView lineName = helper.getView(R.id.bus_line_name);
ImageView dirIcon = helper.getView(R.id.bus_dir_icon);
ImageView dirUp = helper.getView(R.id.bus_dir_icon_up);
ImageView dirDown = helper.getView(R.id.bus_dir_icon_down);
ImageView splitLine = helper.getView(R.id.bus_seg_split_line);
if (helper.getAdapterPosition() == 0) {
dirIcon.setImageResource(R.drawable.dir_start);
lineName.setText("出发");
dirUp.setVisibility(View.INVISIBLE);
dirDown.setVisibility(View.VISIBLE);
splitLine.setVisibility(View.INVISIBLE);
} else if (helper.getAdapterPosition() == mItemList.size() - 1) {
dirIcon.setImageResource(R.drawable.dir_end);
lineName.setText("到达终点");
dirUp.setVisibility(View.VISIBLE);
dirDown.setVisibility(View.INVISIBLE);
} else {
splitLine.setVisibility(View.VISIBLE);
dirUp.setVisibility(View.VISIBLE);
dirDown.setVisibility(View.VISIBLE);
String actionName = item.getAction();
int resID = MapUtil.getDriveActionID(actionName);
dirIcon.setImageResource(resID);
lineName.setText(item.getInstruction());
}
}
}
这里面会有一个方法报错,所以需要在MapUtil中新增如下方法:
代码语言:javascript复制 public static int getDriveActionID(String actionName) {
if (actionName == null || actionName.equals("")) {
return R.drawable.dir3;
}
if ("左转".equals(actionName)) {
return R.drawable.dir2;
}
if ("右转".equals(actionName)) {
return R.drawable.dir1;
}
if ("向左前方行驶".equals(actionName) || "靠左".equals(actionName)) {
return R.drawable.dir6;
}
if ("向右前方行驶".equals(actionName) || "靠右".equals(actionName)) {
return R.drawable.dir5;
}
if ("向左后方行驶".equals(actionName) || "左转调头".equals(actionName)) {
return R.drawable.dir7;
}
if ("向右后方行驶".equals(actionName)) {
return R.drawable.dir8;
}
if ("直行".equals(actionName)) {
return R.drawable.dir3;
}
if ("减速行驶".equals(actionName)) {
return R.drawable.dir4;
}
return R.drawable.dir3;
}
适配器没有问题了,下面进入到RouteDetailActivity,新增如下方法:
代码语言:javascript复制 /**
* 驾车详情
* @param intent
*/
private void driveDetail(Intent intent) {
tvTitle.setText("驾车路线规划");
DrivePath drivePath = intent.getParcelableExtra("path");
String dur = MapUtil.getFriendlyTime((int) drivePath.getDuration());
String dis = MapUtil.getFriendlyLength((int) drivePath.getDistance());
tvTime.setText(dur "(" dis ")");
rv.setLayoutManager(new LinearLayoutManager(this));
rv.setAdapter(new DriveSegmentListAdapter(R.layout.item_segment, drivePath.getSteps()));
}
然后在initView中调用。
在这里插入图片描述
然后运行一下:
在这里插入图片描述
⑨ 公交路线详情
最后这个公交路线详情是最麻烦的,前面三个其实都还蛮简单的。
同样在RouteActivity中找到onBusRouteSearched方法,然后在里面添加如下代码:
代码语言:javascript复制 tvTime.setText(des);
bottomLayout.setVisibility(View.VISIBLE);
bottomLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(RouteActivity.this,
RouteDetailActivity.class);
intent.putExtra("type",3);
intent.putExtra("path", busPath);
startActivity(intent);
}
});
在这里插入图片描述
下面这个适配器的代码就比较多了,为什么呢?因为公交的话它还有这个公交车的信息,比如你是要做几路车,然后经过几个站,之后再转几路车,最后到达终点。因此先增加一个站点的布局,在layout下创建一个item_segment_ex.xml文件,里面的代码如下:
代码语言:javascript复制<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="27dp"
android:layout_marginLeft="15.5dp"
android:layout_marginStart="15.5dp" >
<ImageView
android:id="@ id/bus_dir_icon"
android:layout_width="13dp"
android:layout_height="13dp"
android:layout_centerVertical="true"
android:src="@drawable/dir_station" />
<ImageView
android:id="@ id/bus_dir_icon_up"
android:layout_width="2dp"
android:layout_height="match_parent"
android:layout_above="@id/bus_dir_icon"
android:layout_centerHorizontal="true"
android:background="#b6b6b6" />
<ImageView
android:id="@ id/bus_dir_icon_down"
android:layout_width="2dp"
android:layout_height="match_parent"
android:layout_below="@id/bus_dir_icon"
android:layout_centerHorizontal="true"
android:background="#b6b6b6" />
</RelativeLayout>
<TextView
android:id="@ id/bus_line_station_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:layout_marginLeft="20dp"
android:layout_marginStart="20dp"
android:textColor="#999999"
android:textSize="13sp" />
</LinearLayout>
这里还需要对原来的BusStep进行一次封装,而不是直接使用这个BusStep,在util包下新增一个SchemeBusStep类,代码如下:
代码语言:javascript复制package com.llw.mapdemo.util;
import com.amap.api.services.route.BusStep;
public class SchemeBusStep extends BusStep {
private boolean isWalk = false;
private boolean isBus = false;
private boolean israilway = false;
private boolean istaxi = false;
private boolean isStart = false;
private boolean isEnd = false;
private boolean arrowExpend = false;
public SchemeBusStep(BusStep step) {
if (step != null) {
this.setBusLine(step.getBusLine());
this.setWalk(step.getWalk());
this.setRailway(step.getRailway());
this.setTaxi(step.getTaxi());
}
}
public boolean isArrowExpend() {
return arrowExpend;
}
public void setArrowExpend(boolean arrowExpend) {
this.arrowExpend = arrowExpend;
}
public boolean isWalk() {
return isWalk;
}
public void setWalk(boolean isWalk) {
this.isWalk = isWalk;
}
public boolean isBus() {
return isBus;
}
public void setBus(boolean isBus) {
this.isBus = isBus;
}
public boolean isStart() {
return isStart;
}
public void setStart(boolean isStart) {
this.isStart = isStart;
}
public boolean isEnd() {
return isEnd;
}
public void setEnd(boolean isEnd) {
this.isEnd = isEnd;
}
public boolean isRailway() {
return israilway;
}
public boolean isTaxi() {
return istaxi;
}
public void setRailway(boolean israilway) {
this.israilway = israilway;
}
public void setTaxi(boolean istaxi) {
this.istaxi = istaxi;
}
}
这个里面主要就是对数据的控制,使你在适配器中可以更好处理显示的效果。下面来写这个适配器,在adapter包下新建一个BusSegmentListAdapter类,代码如下:
代码语言:javascript复制package com.llw.mapdemo.adapter;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.amap.api.services.busline.BusStationItem;
import com.amap.api.services.route.BusStep;
import com.amap.api.services.route.RailwayStationItem;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.llw.mapdemo.R;
import com.llw.mapdemo.util.SchemeBusStep;
import java.util.ArrayList;
import java.util.List;
/**
* 公交段列表适配器
*
* @author llw
* @date 2021/2/23 14:37
*/
public class BusSegmentListAdapter extends BaseQuickAdapter<SchemeBusStep, BaseViewHolder> {
private List<SchemeBusStep> mBusStepList;
public BusSegmentListAdapter(int layoutResId, @Nullable List<SchemeBusStep> data) {
super(layoutResId, data);
mBusStepList = data;
}
@Override
protected void convert(BaseViewHolder helper, final SchemeBusStep item) {
RelativeLayout busItem = helper.getView(R.id.bus_item);
TextView busLineName = helper.getView(R.id.bus_line_name);
ImageView busDirIcon = helper.getView(R.id.bus_dir_icon);
TextView busStationNum = helper.getView(R.id.bus_station_num);
final ImageView busExpandImage = helper.getView(R.id.bus_expand_image);
ImageView busDirUp = helper.getView(R.id.bus_dir_icon_up);
ImageView busDirDown = helper.getView(R.id.bus_dir_icon_down);
ImageView splitLine = helper.getView(R.id.bus_seg_split_line);
final LinearLayout expandContent = helper.getView(R.id.expand_content);
if (helper.getAdapterPosition() == 0) {
busDirIcon.setImageResource(R.drawable.dir_start);
busLineName.setText("出发");
busDirUp.setVisibility(View.INVISIBLE);
busDirDown.setVisibility(View.VISIBLE);
splitLine.setVisibility(View.GONE);
busStationNum.setVisibility(View.GONE);
busExpandImage.setVisibility(View.GONE);
} else if (helper.getAdapterPosition() == mBusStepList.size() - 1) {
busDirIcon.setImageResource(R.drawable.dir_end);
busLineName.setText("到达终点");
busDirUp.setVisibility(View.VISIBLE);
busDirDown.setVisibility(View.INVISIBLE);
busStationNum.setVisibility(View.INVISIBLE);
busExpandImage.setVisibility(View.INVISIBLE);
} else {
if (item.isWalk() && item.getWalk() != null && item.getWalk().getDistance() > 0) {
busDirIcon.setImageResource(R.drawable.dir13);
busDirUp.setVisibility(View.VISIBLE);
busDirDown.setVisibility(View.VISIBLE);
busLineName.setText("步行"
(int) item.getWalk().getDistance() "米");
busStationNum.setVisibility(View.GONE);
busExpandImage.setVisibility(View.GONE);
} else if (item.isBus() && item.getBusLines().size() > 0) {
busDirIcon.setImageResource(R.drawable.dir14);
busDirUp.setVisibility(View.VISIBLE);
busDirDown.setVisibility(View.VISIBLE);
busLineName.setText(item.getBusLines().get(0).getBusLineName());
busStationNum.setVisibility(View.VISIBLE);
busStationNum
.setText((item.getBusLines().get(0).getPassStationNum() 1) "站");
busExpandImage.setVisibility(View.VISIBLE);
} else if (item.isRailway() && item.getRailway() != null) {
busDirIcon.setImageResource(R.drawable.dir16);
busDirUp.setVisibility(View.VISIBLE);
busDirDown.setVisibility(View.VISIBLE);
busLineName.setText(item.getRailway().getName());
busStationNum.setVisibility(View.VISIBLE);
busStationNum
.setText((item.getRailway().getViastops().size() 1) "站");
busExpandImage.setVisibility(View.VISIBLE);
} else if (item.isTaxi() && item.getTaxi() != null) {
busDirIcon.setImageResource(R.drawable.dir14);
busDirUp.setVisibility(View.VISIBLE);
busDirDown.setVisibility(View.VISIBLE);
busLineName.setText("打车到终点");
busStationNum.setVisibility(View.GONE);
busExpandImage.setVisibility(View.GONE);
}
}
busItem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (item.isBus()) {//公交
if (item.isArrowExpend() == false) {
item.setArrowExpend(true);
busExpandImage.setImageResource(R.drawable.up);
addBusStation(item.getBusLine().getDepartureBusStation(), expandContent);
for (BusStationItem station : item.getBusLine()
.getPassStations()) {
addBusStation(station, expandContent);
}
addBusStation(item.getBusLine().getArrivalBusStation(), expandContent);
} else {
item.setArrowExpend(false);
busExpandImage.setImageResource(R.drawable.down);
expandContent.removeAllViews();
}
} else if (item.isRailway()) {//火车
if (item.isArrowExpend() == false) {
item.setArrowExpend(true);
busExpandImage.setImageResource(R.drawable.up);
addRailwayStation(item.getRailway().getDeparturestop(), expandContent);
for (RailwayStationItem station : item.getRailway().getViastops()) {
addRailwayStation(station, expandContent);
}
addRailwayStation(item.getRailway().getArrivalstop(), expandContent);
} else {
item.setArrowExpend(false);
busExpandImage.setImageResource(R.drawable.down);
expandContent.removeAllViews();
}
}
}
});
}
/**
* 添加公交车站
* @param station
* @param expandContent
*/
private void addBusStation(BusStationItem station, LinearLayout expandContent) {
LinearLayout ll = (LinearLayout) View.inflate(mContext,
R.layout.item_segment_ex, null);
TextView tv = ll.findViewById(R.id.bus_line_station_name);
tv.setText(station.getBusStationName());
expandContent.addView(ll);
}
/**
* 添加火车站
* @param station
* @param expandContent
*/
private void addRailwayStation(RailwayStationItem station, LinearLayout expandContent) {
LinearLayout ll = (LinearLayout) View.inflate(mContext,
R.layout.item_segment_ex, null);
TextView tv = ll
.findViewById(R.id.bus_line_station_name);
tv.setText(station.getName() " " getRailwayTime(station.getTime()));
expandContent.addView(ll);
}
/**
* 获取铁路时间
* @param time
* @return
*/
public static String getRailwayTime(String time) {
return time.substring(0, 2) ":" time.substring(2, time.length());
}
}
里面也是比较简单的代码,不清楚的话和我说一声,我再给你解释一下。
那么下面进入RouteDetailActivity,先增加一个getBusSteps方法,对BusStep数据进行组装。
代码语言:javascript复制 /**
* 公交方案数据组装
* @param list
* @return
*/
private List<SchemeBusStep> getBusSteps(List<BusStep> list) {
List<SchemeBusStep> busStepList = new ArrayList<>();
SchemeBusStep start = new SchemeBusStep(null);
start.setStart(true);
busStepList.add(start);
for (BusStep busStep : list) {
if (busStep.getWalk() != null && busStep.getWalk().getDistance() > 0) {
SchemeBusStep walk = new SchemeBusStep(busStep);
walk.setWalk(true);
busStepList.add(walk);
}
if (busStep.getBusLine() != null) {
SchemeBusStep bus = new SchemeBusStep(busStep);
bus.setBus(true);
busStepList.add(bus);
}
if (busStep.getRailway() != null) {
SchemeBusStep railway = new SchemeBusStep(busStep);
railway.setRailway(true);
busStepList.add(railway);
}
if (busStep.getTaxi() != null) {
SchemeBusStep taxi = new SchemeBusStep(busStep);
taxi.setTaxi(true);
busStepList.add(taxi);
}
}
SchemeBusStep end = new SchemeBusStep(null);
end.setEnd(true);
busStepList.add(end);
return busStepList;
}
然后添加一个busDetail方法,里面的代码如下:
代码语言:javascript复制 /**
* 公交详情
* @param intent
*/
private void busDetail(Intent intent) {
tvTitle.setText("公交路线规划");
BusPath busPath = intent.getParcelableExtra("path");
String dur = MapUtil.getFriendlyTime((int) busPath.getDuration());
String dis = MapUtil.getFriendlyLength((int) busPath.getDistance());
tvTime.setText(dur "(" dis ")");
rv.setLayoutManager(new LinearLayoutManager(this));
rv.setAdapter(new BusSegmentListAdapter(R.layout.item_segment, getBusSteps(busPath.getSteps())));
}
最后在initView中调用[在这里插入图片描述]
然后运行一下:
在这里插入图片描述
⑩ 手动输入目的地
在实际使用中,通常都是定位到当前所在地,然后用户再输入一个目的地,以此来计算这个两点之间的路线规划,手动点地图这种方式并不常用,因为你很难点到足够精确的位置,其次就是你要在地图上寻找这个地方所在,这样用户花费的时间就会更多,因此日常使用都是手动输入,输入方式有多种,常规的键盘输入、声音输入、扫码输入等。下面我们使用键盘输入。
这里就需要修改activity_route.xml布局了,将之前的出行方式布局改为如下代码:
代码语言:javascript复制 <!--设置出行方式-->
<LinearLayout
android:id="@ id/top_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingStart="6dp"
android:paddingEnd="6dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="出行方式:"
android:textColor="#000"
android:textSize="16sp" />
<Spinner
android:id="@ id/spinner"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1" />
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="6dp"
android:paddingEnd="6dp">
<TextView
android:id="@ id/tv_start"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:gravity="center_vertical"
android:text="当前所在地"
android:textColor="#000"
android:textSize="@dimen/sp_14" />
<EditText
android:id="@ id/et_start_address"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginStart="12dp"
android:layout_toRightOf="@ id/tv_start"
android:background="@null"
android:textColor="#000"
android:textSize="@dimen/sp_12" />
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:layout_below="@ id/et_start_address"
android:background="#000" />
<TextView
android:id="@ id/tv_end"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_below="@ id/et_start_address"
android:layout_marginTop="8dp"
android:gravity="center_vertical"
android:text="前往目的地"
android:textColor="#000"
android:textSize="@dimen/sp_14" />
<EditText
android:id="@ id/et_end_address"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_below="@ id/et_start_address"
android:layout_marginStart="12dp"
android:layout_marginTop="8dp"
android:layout_toRightOf="@ id/tv_end"
android:background="@null"
android:hint="请输入目的地"
android:imeOptions="actionSearch"
android:singleLine="true"
android:textColor="#000"
android:textSize="14sp" />
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:layout_below="@ id/et_end_address"
android:background="#000" />
</RelativeLayout>
</LinearLayout>
预览效果如下:
在这里插入图片描述
然后进入到RouteActivity,创建变量
代码语言:javascript复制 //起点、终点
private EditText etStartAddress, etEndAddress;
然后在initTravelMode方法中绑定ID,同时给目的地输入框添加一个软键盘按键监听
代码语言:javascript复制 etStartAddress = findViewById(R.id.et_start_address);
etEndAddress = findViewById(R.id.et_end_address);
//键盘按键监听
etEndAddress.setOnKeyListener(this);
这里的当前地我还是使用定位所在地,在onLocationChanged方法中增加如下代码
代码语言:javascript复制 //设置当前所在地
etStartAddress.setText(address);
etStartAddress.setEnabled(false);//禁用输入
在这里插入图片描述
我在布局中设置了软键盘变成搜索功能按钮,此时etEndAddress.setOnKeyListener(this);的这个this应该下方有一条红线,因此你当前的Activity需要实现按键监听。
在这里插入图片描述
然后重写onKey方法。
代码语言:javascript复制 @Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP) {
//获取输入框的值
String endAddress = etEndAddress.getText().toString().trim();
if (endAddress.isEmpty()) {
showMsg("请输入要前往的目的地");
} else {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
//隐藏软键盘
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
//通过输入的目的地转为经纬度,然后进行地图上添加标点,最后计算出行路线规划
}
return true;
}
return false;
}
我相信这个代码你应该见过一次了,只不过现在还差一个地址转换的处理,通过地理编码就可以把地址转化成坐标,
代码语言:javascript复制 //地理编码搜索
private GeocodeSearch geocodeSearch;
//解析成功标识码
private static final int PARSE_SUCCESS_CODE = 1000;
然后在initMap中
代码语言:javascript复制 //构造 GeocodeSearch 对象
geocodeSearch = new GeocodeSearch(this);
//设置监听
geocodeSearch.setOnGeocodeSearchListener(this);
同样Activity依然需要实现GeocodeSearch.OnGeocodeSearchListener
在这里插入图片描述
然后重写如下方法:
代码语言:javascript复制 @Override
public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int i) {
}
/**
* 地址转坐标
*
* @param geocodeResult
* @param rCode
*/
@Override
public void onGeocodeSearched(GeocodeResult geocodeResult, int rCode) {
if (rCode == PARSE_SUCCESS_CODE) {
List<GeocodeAddress> geocodeAddressList = geocodeResult.getGeocodeAddressList();
if (geocodeAddressList != null && geocodeAddressList.size() > 0) {
//终点
mEndPoint = geocodeAddressList.get(0).getLatLonPoint();
//开始路线搜索
startRouteSearch();
}
} else {
showMsg("获取坐标失败");
}
}
在onGeocodeSearched方法中通过坐标确定终点,然后进行路线规划。
最后一步就是在onKey方法的else中触发这个地理编码搜索
代码语言:javascript复制 // name表示地址,第二个参数表示查询城市,中文或者中文全拼,citycode、adcode
GeocodeQuery query = new GeocodeQuery(endAddress, city);
geocodeSearch.getFromLocationNameAsyn(query);
在这里插入图片描述
这样就OK了,运行一下。
在这里插入图片描述
十、源码
源码地址:GaodeMapDemo 欢迎Star和Fork
尾声
说实话写这篇文章真的很不容易,花费了我很多精力,当然首先是对得起看这个系列文章的人吧,山高水长,后会有期~