Android 高德地图API(详细步骤+源码)七

2021-03-04 17:36:48 浏览数 (1)

⑦ 骑行路线详情

在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

尾声

  说实话写这篇文章真的很不容易,花费了我很多精力,当然首先是对得起看这个系列文章的人吧,山高水长,后会有期~

0 人点赞