Android百度地图的使用

来源:互联网 发布:mac 安装dmg到user 编辑:程序博客网 时间:2024/06/05 02:28
1、环境配置
     申请密钥,下载sdk(jar和so库),Android Studio的话如果在时在lib下面放的jar包和so库build文件加上
sourceSets {
    main {
        jniLibs.srcDirs = ['libs']
    }
}
在AndroidManifest文件中加上
<meta-data
    android:name="com.baidu.lbsapi.API_KEY"
   android:value="申请的密钥"
/>


2、显示百度地图
     添加MapView控件,并初始化,加载布局前先初始化sdk
SDKInitializer.initialize(getApplicationContext());

3、地图的基本应用

        baiduMap mapView.getMap();
        MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);
        baiduMap.setMapStatus(msu);                             //设置比例尺
        baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);           //设置地图类型可选择基础地图,卫星地图和空白地图
//        baiduMap.setTrafficEnabled(true);                         //获取交通实况
        mapView.setLogoPosition(LogoPosition.logoPostionleftTop);
        //定义Marker坐标点
        LatLng point = new LatLng(39.963175116.400244);
        BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);
        //构建MarkerOption,用于在地图上添加Marker
        MarkerOptions options = new MarkerOptions().position(point).icon(bitmap);
        //在地图上添加Marker,并显示
        options.animateType(MarkerOptions.MarkerAnimateType.drop);
        baiduMap.addOverlay(options);

4、地图定位
//定位相关
private LocationClient mLocationClient;
private MyLocationListener myLocationListener;
核心类 LocationClient  ,监听MyLocationListener 继承BDLocationListener
初始化
private void initLocation() {
    mLocationClient new LocationClient(this);
    myLocationListener new MyLocationListener();
    mLocationClient.registerLocationListener(myLocationListener);
    LocationClientOption option = new LocationClientOption();
    option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy)//设置定位模式:高精度、低功耗、仅设备
    option.setCoorType("bd09ll");         //设置坐标系为百度经纬度
    option.setIsNeedAddress(true);         //设置获取地址
    option.setOpenGps(true);         //开启GPS
    option.setScanSpan(1000);         //设置请求间隔时间
    mLocationClient.setLocOption(option);
}
定位监听
private class MyLocationListener implements BDLocationListener {

    @Override
    public void onReceiveLocation(BDLocation bdLocation) {
        MyLocationData data = new MyLocationData.Builder()       //构造定位数据
                .accuracy(bdLocation.getRadius())             //获取精准度
                .longitude(bdLocation.getLongitude())
                .latitude(bdLocation.getLatitude())
                .build();
        mBaiduMap.setMyLocationData(data);       //设置定位数据
        if (isFirst == true) {
            LatLng latLng = new LatLng(bdLocation.getLatitude()bdLocation.getLongitude());
            MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
            mBaiduMap.animateMapStatus(msu);           //第一次定位时将MapStatusUpdate更新经纬度并定位
            isFirst false;
            Toast.makeText(contextbdLocation.getAddrStr()Toast.LENGTH_LONG).show();
        }
    }

    @Override
    public void onConnectHotSpotMessage(String s, int i) {

    }
}
最后开启定位图层并开始定位
mBaiduMap.setMyLocationEnabled(true);   //开启定位图层
if (!mLocationClient.isStarted())
    mLocationClient.start();
并在不需要定位时关闭定位图层和关闭定位
mBaiduMap.setMyLocationEnabled(false);
mLocationClient.stop();

5、方向传感器
设置定图标
bitmap = BitmapDescriptorFactory.fromResource(R.mipmap.navi_map_gps_locked);
MyLocationConfiguration config = new MyLocationConfiguration(mLocationMode, true, bitmap);

并可以设置定位模式:罗盘、跟随、普通及
LocationMode.COMPASS
LocationMode.FOLLOWING
LocationMode.NORMAL


写一个类MyOrientationListener继承SensorEventListener  ,获取方向传感器并进行注册监听
public void start() {
    mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
    if (mSensorManager != null) {
        //获得方向传感器
        mSensor mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
    }
    if (mSensor != null) {
        mSensorManager.registerListener(this, mSensorSensorManager.SENSOR_DELAY_UI);
    }
}
在stop的时候取消注册

写一个接口用于监听
public interface OnOrientationListener {
    void onOrientationChange(float lastX);
}
在方向改变去把X数据传到之前写的接口中
@Override
public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
        float x = event.values[SensorManager.DATA_X];
        if (Math.abs(x - lastX) > 1.0) {
            if (mOnOrientationListener != null) {
                mOnOrientationListener.onOrientationChange(x);
            }

        }
        lastX = x;
    }

}

最后在Activity中开启方向传感器并在onStop时停止方向传感器,并初始化之前写的MyOrientationListener并设置回调
mMyOrientationListener = new MyOrientationListener(context);
mMyOrientationListener.setOnOrientationListener(new MyOrientationListener.OnOrientationListener() {
    @Override
    public void onOrientationChange(float lastX) {
        currentX = lastX;
    }
});

mMyOrientationListener.start();

mMyOrientationListener.stop();
在MyLocationData中获取方向
MyLocationData data = new MyLocationData.Builder()       //构造定位数据
        .direction(currentX)                           //获取方向
        .accuracy(bdLocation.getRadius())             //获取精准度
        .longitude(bdLocation.getLongitude())
        .latitude(bdLocation.getLatitude())
        .build();

6、地图覆盖物
创建一个Marker,OverlayOptions制定经纬度和图标,并可以用同一个Bundle来帮绑定数据
private void addOverlays(List<Info> infoList) {
    mBaiduMap.clear();
    LatLng latLng = null;
    Marker marker = null;
    OverlayOptions option;
    for (Info info : infoList) {
        latLng = new LatLng(info.getLatitude()info.getLongitude());
        option = new MarkerOptions().position(latLng).icon(mMarker).zIndex(5);
        marker = (Marker) mBaiduMap.addOverlay(option);
        Bundle bundle = new Bundle();
        bundle.putSerializable("info"info);
        marker.setExtraInfo(bundle);
    }
    MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
    mBaiduMap.setMapStatus(msu);
}

可以通过setOnMapClickListener来监听点击地图事件
mBaiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
    @Override
    public void onMapClick(LatLng latLng) {
        mMarkerlayout.setVisibility(View.GONE);
        mBaiduMap.hideInfoWindow();
    }

    @Override
    public boolean onMapPoiClick(MapPoi mapPoi) {
        return false;
    }
});

点击Marker事件,通过setOnMarkerClickListener来监听,并获取之前绑定的Bundle数据,把数据进行设置,
可以通过InfoWindow来添加点击时图标上的文字,先new一个view,再获取Marker的经纬度,根据经纬度转换成Point,再Y坐标设置偏移量,对其转换为经纬度,
最后new一个InfoWindow设置监听
mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
    @Override
    public boolean onMarkerClick(Marker marker) {
        mMarkerlayout.setVisibility(View.VISIBLE);
        Bundle bundle = marker.getExtraInfo();
        Info info = (Info) bundle.getSerializable("info");
        imgInfo.setImageResource(info.getImgId());
        name.setText(info.getName());
        distance.setText(info.getDistance());
        zan.setText(info.getZan()+"");

        TextView tv = new TextView(context);
        tv.setBackgroundResource(R.mipmap.location_tips);
        tv.setText(info.getName());
        tv.setTextColor(Color.WHITE);
        LatLng latLng = marker.getPosition();
        Point p = mBaiduMap.getProjection().toScreenLocation(latLng);
        p.-= 47;
        LatLng ll = mBaiduMap.getProjection().fromScreenLocation(p);
        BitmapDescriptor des = BitmapDescriptorFactory.fromView(tv);
        infoWindow new InfoWindow(des,ll,0,new InfoWindow.OnInfoWindowClickListener() {
            @Override
            public void onInfoWindowClick() {
                mBaiduMap.hideInfoWindow();
            }
        });
        mBaiduMap.showInfoWindow(infoWindow);
        return false;
    }
});
最后的效果图





原创粉丝点击