安卓之使用百度地图显示地图和经纬度(二)

302 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

做好了前期准备工作之后

就可以开始愉快的写代码了

首先我们先在res的我们想显示地图layout里创建一个地图控件

<com.baidu.mapapi.map.MapView
    android:id="@+id/bmapView"
    android:layout_width="match_parent"
    android:layout_height="666dp"
    android:clickable="true">

</com.baidu.mapapi.map.MapView>

下面就是与地图layout相关联的activity代码:

package com.example.light;

import android.app.Activity;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import com.baidu.location.Address;
import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapPoi;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.model.LatLng;


public class MapActivity extends Activity {
    private MapView mMapView = null;
    private BaiduMap mBaiduMap;
    ImageView message;
    static String adr1;
    static String adr2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);
//        获取地图控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);
        message = findViewById(R.id.message);
        mBaiduMap = mMapView.getMap();
        mBaiduMap.setMaxAndMinZoomLevel(15, 20);
        message.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                messageT();
            }
        });
        mMapView.showZoomControls(true);
        //定位初始化
        LocationClient mLocationClient = new LocationClient(this);
//通过LocationClientOption设置LocationClient相关参数
        LocationClientOption option = new LocationClientOption();
        option.setIsNeedLocationDescribe(true);
        option.setIsNeedAddress(true);
        option.setOpenGps(true); // 打开gps
        option.setCoorType("bd09ll"); // 设置坐标类型
        option.setScanSpan(15000);
        option.setIsNeedLocationDescribe(true);
//设置locationClientOption
        mLocationClient.setLocOption(option);
//注册LocationListener监听器
        MyLocationListener myLocationListener = new MyLocationListener();
        mLocationClient.registerLocationListener(myLocationListener);
//开启地图定位图层
        mLocationClient.start();
        return;
    }

    private void messageT() {

        if (adr1 == null) {
            Toast t = Toast.makeText(MapActivity.this, "数据正在更新,请稍等", Toast.LENGTH_SHORT);
            t.show();
        } else {
            Toast t = Toast.makeText(MapActivity.this, "你现在的位置是在:" + adr2 + adr1, Toast.LENGTH_LONG);
            t.show();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
        mMapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
        mMapView.onPause();
    }

    @Override
    protected void onDestroy() {
        LocationClient mLocationClient = new LocationClient(this);
        mLocationClient.stop();
        mBaiduMap.setMyLocationEnabled(false);
        mMapView.onDestroy();
        mMapView = null;
        super.onDestroy();
    }

    public class MyLocationListener extends BDAbstractLocationListener {
        @Override
        public void onReceiveLocation(BDLocation bdLocation) {
            //经度
            double longitude = bdLocation.getLongitude();
            //纬度
            final double latitude = bdLocation.getLatitude();

            String addrest = bdLocation.getLocationDescribe();
            String addr = bdLocation.getAddrStr();    //获取详细地址信息
            adr1 = addrest;
            adr2 = addr;
            String country = bdLocation.getCountry();    //获取国家
            String province = bdLocation.getProvince();    //获取省份
            String city = bdLocation.getCity();    //获取城市
            String district = bdLocation.getDistrict();    //获取区县
            String street = bdLocation.getStreet();    //获取街道信息
            String adcode = bdLocation.getAdCode();    //获取adcode
            String town = bdLocation.getTown();    //获取乡镇信息
            Log.d("Debug", "经度:" + longitude + ",纬度:" + latitude + "地址" + addr + addrest);

            //移动地图
            LatLng latLng = new LatLng(latitude, longitude);
            MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLngZoom(latLng, 17);
            mBaiduMap.animateMapStatus(mapStatusUpdate);

            //显示图片


            MarkerOptions options = new MarkerOptions();
            options.position(latLng);
            BitmapFactory mBitmapOptions = new BitmapFactory();

            BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.mipmap.map);
            options.icon(bitmapDescriptor);
            mBaiduMap.addOverlay(options);

            //在地图上单击
            mBaiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
                @Override
                public void onMapClick(LatLng latLng) {
                    //清除地图上的图片
                    mBaiduMap.clear();
                    Log.d("Debug", "单击的位置是:" + latLng.latitude + "," + latLng.longitude);
                    //单击的位置显示图片
                    MarkerOptions options = new MarkerOptions();
                    options.position(latLng);
                    options.icon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher));
                    mBaiduMap.addOverlay(options);
                }

                @Override
                public void onMapPoiClick(MapPoi mapPoi) {

                }
            });
        }
    }
}

首先在这个显示的layout的Activity里获取地图控件引用( // 获取地图控件引用 mMapView = (MapView) findViewById(R.id.bmapView); )

然后再从创建的百度地图的变量里获取地图变量 设置地图的缩放等级( mBaiduMap.setMaxAndMinZoomLevel(15, 20); )和 是否控制显示缩放(mMapView.showZoomControls(true); )

然后是让定位初始化 创建一个LocationClient 设置相关参数

      //定位初始化
        LocationClient mLocationClient = new LocationClient(this);
//通过LocationClientOption设置LocationClient相关参数
        LocationClientOption option = new LocationClientOption();
        option.setIsNeedLocationDescribe(true);
        option.setIsNeedAddress(true);
        option.setOpenGps(true); // 打开gps
        option.setCoorType("bd09ll"); // 设置坐标类型
        option.setScanSpan(15000);
        option.setIsNeedLocationDescribe(true);
//设置locationClientOption
        mLocationClient.setLocOption(option);
//开启地图定位图层
        mLocationClient.start();

设置好之后 最重要的是注册LocationListener监听器

//注册LocationListener监听器
        MyLocationListener myLocationListener = new MyLocationListener();
        mLocationClient.registerLocationListener(myLocationListener);

这个监听器是监听你点击地图控件时 你要显示的内容 而我要显示的就是让他提示所在的经纬度 和设置显示坐标图片 具体代码也很简单 你们看我上面的代码就可以理解