Android 通过百度地图实现膜拜单车首界面效果

最近在学习一些百度地图相关的API应用,中间有一个功能是实现类似膜拜单车首页的效果。本文将介绍通过百度地图来实现膜拜单车首界面的效果。先看下膜拜单车效果图(本文截取的是微信小程序的效果图)

效果分析

根据上图中膜拜单车的效果,主要实现功能是:进入地图界面获取定位,移动定位到地图中心点,获取中心点周边Poi信息,拖动地图,中心点图标不动,地图拖动停止,重新请求中心点周边Poi。根据上述功能,我们将通过百度地图依次实现上述功能。

布局效果的实现

百度开发平台注册相关账号,获取ak,在布局文件中添加百度地图控件和图片控件。其中图片控件为中心点图标,布局位于地图控件中心。本文直接通过相对布局进行实现:

"http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.baidu.mapapi.map.TextureMapView
         android:id="@+id/home_map_mapview"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:clickable="true"/>

    "80dp"
        android:layout_height="18dp"
        android:layout_centerInParent="true"
        android:src="@drawable/img_map_center_logo" />

配置地图,获取定位

配置相关地图设置,获取地图定位信息,并将地图移动到定位点:

//mMapView 为布局文件TextureMapView
mBaiduMap = mMapView.getMap();
mMapView.showScaleControl(false);
mMapView.showZoomControls(false);//缩放控制器
UiSettings settings = mBaiduMap.getUiSettings();
settings.setAllGesturesEnabled(true);//手势操作
mBaiduMap.setMyLocationEnabled(true);
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(16));//缩放到200M

//配置定位图层显示方式
MyLocationConfiguration.LocationMode mLocationMode = MyLocationConfiguration.LocationMode.NORMAL;
Bitmap mapBitmap = UIUtils.zoomImg(BitmapFactory.decodeResource(getResources(), R.drawable.map_trans_location), 64, 100);
BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory.fromBitmap(mapBitmap);
mBaiduMap.setMyLocationConfiguration(new MyLocationConfiguration(mLocationMode, false, mCurrentMarker));

mBaiduMap.setOnMapStatusChangeListener(onMapStatusChangeListener);

myListener = new MyLocationListener() {
     @Override
     public void onReceiveLocation(BDLocation location) {
        super.onReceiveLocation(location);
        if (location == null || mBaiduMap == null) {
            return;
        }
        int errorCode = location.getLocType();
        if (errorCode == 61 || errorCode == 161 || errorCode == 66 || errorCode == 68) {
            double latitude = location.getLatitude();
            double longitude = location.getLongitude();
            float radius = location.getRadius();

        MyLocationData locData = new MyLocationData.Builder()
//          .accuracy(radius) //是否显示定位精度(默认定位圆)
            .direction(100).latitude(latitude)
            .longitude(longitude).build();

        mBaiduMap.setMyLocationData(locData);

        myLocInfo = new LatLng(latitude, longitude);
        MapStatus mMapStatus = new MapStatus.Builder().target(myLocInfo).build();
        // 定义MapStatusUpdate对象,以便描述地图状态将要发生的变化
        MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
        // 改变地图状态
        mBaiduMap.setMapStatus(mMapStatusUpdate);

        if (myLocInfo != null) {
        if (isRepeatLoc) {
             isRepeatLoc = false;
             requestCenterPoiList(myLocInfo);
            }
          }
       } else {
       if (isFirstLocationError) {
           isFirstLocationError = false;
           UIUtils.showToast("获取位置信息失败,请稍后重试");
          }
          Log.e("locationError", "获取位置信息失败,请稍后重试");
        }
    }
};

mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(myListener);
setLocationOptions();
mLocationClient.start();

通过上文代码,我们获取了定位坐标,并且移动地图到定位点。其中requestCenterPoiList(myLocInfo)是用来获取坐标周边的Poi信息的请求借口,isRepeatLoc是初始化的一个Boolean型变量,用于判断是否进行了重新定位(默认为true),用于地图的手动重新定位,isFirstLocationError是用来提醒用户定位错误信息,同时避免提示多次,setLocationOptions()方法则是配置LocationClientOption定位相关的信息,本文配置内容如下:

private void setLocationOptions() {
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
        option.setCoorType("bd09ll");
        option.setScanSpan(0);
        option.setOpenGps(true);
        option.setLocationNotify(true);
        option.setIgnoreKillProcess(false);
        option.SetIgnoreCacheException(true);
        option.setWifiCacheTimeOut(5 * 60 * 1000);
        option.setEnableSimulateGps(false);
        option.setIsNeedAddress(true);
        mLocationClient.setLocOption(option);
    }

监听地图的拖动

在上文的定位代码逻辑中有一个方法,没有讲到mBaiduMap.setOnMapStatusChangeListener(onMapStatusChangeListener);
监听方法如下:

BaiduMap.OnMapStatusChangeListener onMapStatusChangeListener = new BaiduMap.OnMapStatusChangeListener() {
        @Override
        public void onMapStatusChangeStart(MapStatus mapStatus) {
        }

        @Override
        public void onMapStatusChangeStart(MapStatus mapStatus, int i) {

        }

        @Override
        public void onMapStatusChange(MapStatus mapStatus) {

        }

        @Override
        public void onMapStatusChangeFinish(MapStatus mapStatus) {
            requestCenterPos(mapStatus);
        }
    };

在onMapStatusChangeFinish方法中,我们即可获取地图的MapStatus 信息,通过MapStatus获取中心点坐标,继而获取周边Poi信息:

private void requestCenterPos(MapStatus mapStatus) {
        centerLocInfo = mapStatus.target;
        requestCenterPoiList(centerLocInfo);

    }

至此,上文中膜拜单车的地图效果即可实现,如有问题,欢迎留言。

你可能感兴趣的:(android)