安卓高德地图 - (POI数据+导航界面4)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34536167/article/details/79333501

1、效果图

这里写图片描述

这里写图片描述

2、Poi数据搜索

2.1、EditText的输入监听和ListView控件(自行初始化即可)

 /**
     * EditText输入框监听事件
     */
    private void searchAddressListener() {
        searchAddress.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                if (!TextUtils.isEmpty(charSequence)) {
                    //第二个参数传入null或者“”代表在全国进行检索,否则按照传入的city进行检索
                    InputtipsQuery inputquery = new InputtipsQuery(String.valueOf(charSequence), cityName);
                    //限制在当前城市
                    inputquery.setCityLimit(true);
                    //构造 Inputtips 对象,并设置监听。
                    Inputtips inputTips = new Inputtips(MainActivity.this, inputquery);
                    //回调结果集
                    inputTips.setInputtipsListener(new Inputtips.InputtipsListener() {
                        @Override
                        public void onGetInputtips(final List<Tip> list, int i) {
                            //1000为成功
                            if (i == 1000) {
                                listview.setVisibility(View.VISIBLE);
                                TipAdapter adapter = new TipAdapter(MainActivity.this, list);
                                listview.setAdapter(adapter);
                                listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                                    @Override
                                    public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
                                        //当前位置的纬度、经度与选中地点的经度纬度
                                        MapNaviActivity.startActivity(MainActivity.this, latitude, longitude,
                                                list.get(position).getPoint().getLatitude(),
                                                list.get(position).getPoint().getLongitude());
                                        Log.e(TAG, "onItemClick: 地点"+ list.get(position).getDistrict());
                                    }
                                });
                            } else {
                                Log.e(TAG, "onGetInputtips: 暂无搜索结果");
                            }
                        }
                    });
                    //调用 PoiSearch 的 requestInputtipsAsyn() 方法发送请求
                    inputTips.requestInputtipsAsyn();
                } else {
                    listview.setVisibility(View.GONE);
                }
            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });
    }

2.2、TipAdapter - CommonAdapter链接:http://blog.csdn.net/qq_34536167/article/details/79327007

public class TipAdapter extends CommonAdapter<Tip> {

    public TipAdapter(Context context, List<Tip> mDatas) {
        super(context, R.layout.list_tip_item, mDatas);
    }

    @Override
    public void convert(ViewHolder holder, Tip item, int postion) {
        //名称
        String name = item.getName();
        holder.setText(R.id.tip_item_name, TextUtils.isEmpty(name) ? "" : name);
        //地址
        String address = item.getAddress();
        holder.setText(R.id.tip_item_address, TextUtils.isEmpty(address) ? "" : address);
    }
}

2.3、list_tip_item布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:padding="10dp"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tip_item_name"/>

    <TextView
        android:layout_marginTop="5dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tip_item_address"/>
</LinearLayout>

2.4、activity_main布局

<?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="vertical">

    <EditText
        android:id="@+id/search_address"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入地名" />

    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="#666"
        android:dividerHeight="1dp"
        android:visibility="gone" />
</LinearLayout>

3、导航界面

3.1、MapNaviActivity

public class MapNaviActivity extends AppCompatActivity implements AMapNaviListener, AMapNaviViewListener {

    //导航View
    private AMapNaviView aMapNaviView;
    private AMapNavi mAMapNavi;
    private static final String TAG = "MapNaviActivity";
    //起、终点list
    private List<NaviLatLng> mStartList;
    private List<NaviLatLng> mEndList;

    //出发与结束的经纬度
    public static void startActivity(Context context, double startlatitude, double startlongitude,
                                     double endlatitude, double endlongitude) {
        Intent intent = new Intent(context, MapNaviActivity.class);
        intent.putExtra(Constans.LATITUDE, startlatitude);
        intent.putExtra(Constans.LONGITUDE, startlongitude);
        intent.putExtra(Constans.ENDLATITUDE, endlatitude);
        intent.putExtra(Constans.ENDLONGITUDE, endlongitude);
        context.startActivity(intent);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map_navi);
        aMapNaviView = (AMapNaviView) this.findViewById(R.id.aMapNaviView);
        aMapNaviView.onCreate(savedInstanceState);
        initView();
    }

    /**
     * 初始化导航配置
     */
    private void initView() {
        //开始导航监听
        aMapNaviView.setAMapNaviViewListener(this);
        //获取AMapNavi实例
        mAMapNavi = AMapNavi.getInstance(getApplicationContext());
        //添加监听回调,用于处理算路成功
        mAMapNavi.addAMapNaviListener(this);
        //设置模拟导航的行车速度(可坐在 onCalculateRouteSuccess方法中进行测试)
        //设置超过120,返回的速度为60
        mAMapNavi.setEmulatorNaviSpeed(120);
        //设置导航的起始点经纬度
        addLocation();
    }

    private void addLocation() {
        if (mStartList == null) {
            mStartList = new ArrayList<>();
        }
        if (mEndList == null) {
            mEndList = new ArrayList<>();
        }
        //起点纬度
        double startlatitude = getIntent().getDoubleExtra(Constans.LATITUDE, 0);
        //起点经度
        double startlongitude = getIntent().getDoubleExtra(Constans.LONGITUDE, 0);
        //终点纬度
        double endlatitude = getIntent().getDoubleExtra(Constans.ENDLATITUDE, 0);
        //终点经度
        double endlongitude = getIntent().getDoubleExtra(Constans.ENDLONGITUDE, 0);

        //起点、终点、多路径(null),基本参数
        NaviLatLng startLatLng = new NaviLatLng(startlatitude, startlongitude);
        NaviLatLng endLatLng = new NaviLatLng(endlatitude, endlongitude);
        mStartList.add(startLatLng);
        mEndList.add(endLatLng);
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (aMapNaviView != null) {
            aMapNaviView.onResume();
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (aMapNaviView != null) {
            aMapNaviView.onPause();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (aMapNaviView != null) {
            aMapNaviView.onDestroy();
            //since 1.6.0 不再在naviview destroy的时候自动执行AMapNavi.stopNavi();请自行执行
            mAMapNavi.stopNavi();
            mAMapNavi.destroy();
        }
    }

    /**
     * AMapNaviListener方法
     */
    @Override
    public void onInitNaviFailure() {
        showToast("初始化导航失败");
        Log.e(TAG, "初始化导航失败");
    }

    @Override
    public void onInitNaviSuccess() {
        showToast("初始化导航成功");
        Log.e(TAG, "初始化导航成功");
        /**
         * @congestion 躲避拥堵
         * @avoidhightspeed 不走高速
         * @cost 避免收费
         * @hightspeed 高速优先
         * @multipleroute 多路径 最后一个参数为true时代表多路径,否则代表单路径
         *
         *  说明: 以上参数都是boolean类型,其中multipleroute参数表示是否多条路线,如果为true则此策略会算出多条路线。
         *  注意: 不走高速与高速优先不能同时为true 高速优先与避免收费不能同时为true
         */
        // int strategy = 0;
        try {
            //躲避拥堵、不走高速、避免收费、高速优先、是否为多路径
            int strategy = mAMapNavi.strategyConvert(true, false, false, false, false);         
            mAMapNavi.calculateDriveRoute(mStartList, mEndList, null, strategy);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onStartNavi(int i) {
        Log.e(TAG, "开始导航");
    }

    @Override
    public void onTrafficStatusUpdate() {

    }

    @Override
    public void onLocationChange(AMapNaviLocation aMapNaviLocation) {
        Log.e(TAG, "当前实时位置的经度" + aMapNaviLocation.getCoord().getLongitude());
        Log.e(TAG, "当前实时位置的纬度" + aMapNaviLocation.getCoord().getLatitude());

    }

    @Override
    public void onGetNavigationText(int i, String s) {
        //i=1返回成功 (可自行添加语音播报)
        Log.e(TAG, "播报类型和播报文字回调: " + i + "\n" + s);
    }

    @Override
    public void onGetNavigationText(String s) {
        //播报类型和播报文字回调(旧方法) 会执行但S不会有返回
    }

    @Override
    public void onEndEmulatorNavi() {
        Log.e(TAG, "结束模拟导航: ");
    }

    @Override
    public void onArriveDestination() {
        Log.e(TAG, "到达目的地,本次导航结束");
    }

    @Override
    public void onCalculateRouteFailure(int i) {
        Log.e(TAG, "很抱歉,路线计算失败");
    }

    @Override
    public void onReCalculateRouteForYaw() {
        Log.e(TAG, "偏航后重新计算路线回调: ");
    }

    @Override
    public void onReCalculateRouteForTrafficJam() {
        Log.e(TAG, "拥堵后重新计算路线回调: ");
    }

    @Override
    public void onArrivedWayPoint(int i) {
    }

    @Override
    public void onGpsOpenStatus(boolean b) {
        Log.e(TAG, "GPS开启的状态: "+b);
        if (b) {
            showToast("GPS已开启");
        } else {
            showToast("GPS未开启");
        }
    }

    @Override
    public void onNaviInfoUpdate(NaviInfo naviInfo) {
        Log.e(TAG, "当前行驶的速度:" + naviInfo.getCurrentSpeed());
        Log.e(TAG, "当前行驶的道路:" + naviInfo.getCurrentRoadName());
    }

    @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 showModeCross(AMapModelCross aMapModelCross) {

    }

    @Override
    public void hideModeCross() {

    }

    @Override
    public void showLaneInfo(AMapLaneInfo[] aMapLaneInfos, byte[] bytes, byte[] bytes1) {

    }

    @Override
    public void hideLaneInfo() {

    }

    @Override
    public void onCalculateRouteSuccess(int[] ints) {
        Log.e(TAG, "路线计算成功: ");
        //GPS 模式 1 EMULATOR 模拟导航 2
        mAMapNavi.startNavi(NaviType.EMULATOR);
        //mAMapNavi.startNavi(NaviType.GPS);
    }

    @Override
    public void notifyParallelRoad(int i) {
        if (i == 0) {
            showToast("当前在主辅路过渡");
            return;
        }
        if (i == 1) {
            showToast("当前在主路");
            return;
        }
        if (i == 2) {
            showToast("当前在辅路");
        }
    }

    @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) {

    }

    /****************************************************************AMapNaviViewListener 方法 底部导航View监听*/
    @Override
    public void onNaviSetting() {
        Log.e(TAG, "底部导航设置点击回调: " );
    }

    @Override
    public void onNaviCancel() {
        this.finish();
        Log.e(TAG, "取消导航设置点击回调: " );
    }

    @Override
    public boolean onNaviBackClick() {
        return false;
    }

    @Override
    public void onNaviMapMode(int i) {
        Log.e(TAG, "地图的模式: "+i );
    }

    @Override
    public void onNaviTurnClick() {
        Log.e(TAG,"转弯view的点击回调: ");
    }

    @Override
    public void onNextRoadClick() {
        Log.e(TAG,"下一个道路View点击回调: ");
    }

    @Override
    public void onScanViewButtonClick() {

    }

    @Override
    public void onLockMap(boolean b) {

    }

    @Override
    public void onNaviViewLoaded() {

    }

    private void showToast(String str) {
        Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
    }
}

3.2、常量类:Constans 用来传值

public class Constans {
    public static final String LATITUDE = "latitude";
    public static final String LONGITUDE = "longitude";
    public static final String ENDLATITUDE = "endlatitude";
    public static final String ENDLONGITUDE = "endlongitude";
}

3.3、activity_map_navi 布局

<?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">

    <com.amap.api.navi.AMapNaviView
        android:id="@+id/aMapNaviView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

猜你喜欢

转载自blog.csdn.net/qq_34536167/article/details/79333501