前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android 高德地图API(详细步骤+源码)七

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

原创
作者头像
晨曦_LLW
修改2021-03-04 17:36:48
1.6K4
修改2021-03-04 17:36:48
举报

⑦ 骑行路线详情

在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

尾声

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ⑦ 骑行路线详情
  • ⑧ 驾车路线详情
  • ⑨ 公交路线详情
  • ⑩ 手动输入目的地
  • 十、源码
  • 尾声
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档