百度地图在合适视野范围内显示所有的点

来源:互联网 发布:java使用openoffice 编辑:程序博客网 时间:2024/05/20 17:59

通常地图会显示出多个点,如像行驶轨迹等,往往在屏幕上一次性就全部显示出来,那要怎么设置地图的显示宽高,才能将所有的点合理的显示出来呢。

看看以下的代码实现:

 private void setMyLocation() {        list = new ArrayList<>();        LatLng ll = new LatLng(24.475982,                118.093132);        LatLng ll1 = new LatLng(24.477382,                118.093232);        LatLng ll2 = new LatLng(24.478382,                118.093832);        LatLng ll3 = new LatLng(24.487382,                118.094232);        LatLng ll4 = new LatLng(24.497982,                118.099562);        list.add(ll);        list.add(ll1);        list.add(ll2);        list.add(ll3);        list.add(ll4);        MapStatus.Builder builder = new MapStatus.Builder();        builder.target(ll).zoom(18.0f);//        mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));        for (LatLng latLng : list) {            mBaiduMap.addOverlay(new BaiduMapUtil().setMarker(latLng));        }        mBaiduMap.addOverlay(new BaiduMapUtil().Polyline(list));//将所有的坐标显示出来的合理视图        if (isFrist) {            mBaiduMap.setOnMapLoadedCallback(new BaiduMap.OnMapLoadedCallback() {                @Override                public void onMapLoaded() {                    isFrist=false;                    mBaiduMap.animateMapStatus(new BaiduMapUtil().setLatLngBounds(list, mMapView));                }            });        }else{            mBaiduMap.animateMapStatus(new BaiduMapUtil().setLatLngBounds(list, mMapView));        }    }


以下为工具类BaiduMapUtil的具体实现

public class BaiduMapUtil {    /**     * 绘制Marker,地图上常见的类似气球形状的图层     */    public MarkerOptions setMarker(LatLng latLng) {        return setMarker(latLng, R.drawable.icon_defult_marker);    }    public MarkerOptions setMarker(LatLng latLng, int drawableId) {        MarkerOptions markerOptions = new MarkerOptions();//参数设置类        markerOptions.position(latLng);//marker坐标位置        markerOptions.icon(BitmapDescriptorFactory                .fromResource(drawableId));//marker图标,可以自定义        markerOptions.draggable(false);//是否可拖拽,默认不可拖拽        markerOptions.anchor(0.5f, 1.0f);//设置 marker覆盖物与位置点的位置关系,默认(0.5f, 1.0f)水平居中,垂直下对齐        markerOptions.alpha(0.8f);//marker图标透明度,0~1.0,默认为1.0        markerOptions.animateType(MarkerOptions.MarkerAnimateType.none);//marker出现的方式,从天上掉下        markerOptions.flat(false);//marker突变是否平贴地面        markerOptions.zIndex(1);//index        return markerOptions;    }    /**     * 绘制折线     */    public PolylineOptions Polyline(List<LatLng> points) {        PolylineOptions polylineOptions = new PolylineOptions();//参数设置类        polylineOptions.width(10);//宽度,单位:像素        polylineOptions.color(0xAAFF0000);//设置折线颜色        polylineOptions.points(points);//折线顶点坐标集        return polylineOptions;    }    /**     * 多个点,在Android里面显示合理的缩放级     */    public MapStatusUpdate setLatLngBounds(List<LatLng> points, MapView mMapView) {        LatLngBounds.Builder builder2 = new LatLngBounds.Builder();        for (LatLng p : points) {            builder2 = builder2.include(p);        }        LatLngBounds latlngBounds = builder2.build();        MapStatusUpdate u = MapStatusUpdateFactory.newLatLngBounds(latlngBounds, mMapView.getWidth(), mMapView.getHeight());        return u;    }}

//将所有的坐标显示出来的合理视图        if (isFrist) {            mBaiduMap.setOnMapLoadedCallback(new BaiduMap.OnMapLoadedCallback() {                @Override                public void onMapLoaded() {                    isFrist=false;                    mBaiduMap.animateMapStatus(new BaiduMapUtil().setLatLngBounds(list, mMapView));                }            });        }else{            mBaiduMap.animateMapStatus(new BaiduMapUtil().setLatLngBounds(list, mMapView));        }
这段代码为显示合理范围的核心代码,加入是否为首次的判断,因为要在OnMapLoadedCallback中实现是关键,否则mapview的with和height取得是0,如果在其他视觉范围内,想恢复到这个合理的范围则经过首次加载后,就不会再执行OnMapLoadedCallback方法,所以要判断是否为第一次加载的状态。




阅读全文
0 0
原创粉丝点击