百度地图学习总结(4)—添加覆盖物

来源:互联网 发布:wet n wild靠谱淘宝店 编辑:程序博客网 时间:2024/06/06 01:05

0.前言:

上篇讲了定位

这篇我们来讲如何添加覆盖物。
先看效果图:本文就是要实现这么一个效果图:

1.模拟数据传入并生成覆盖物:

    /***     * 初始化图层     * 这一段代码一旦执行,地图上就出现了所传入的覆盖物信息     * @param infos 模拟数据,覆盖物的点     */    public void addInfosOverlay(List<Info> infos)    {        mBaiduMap.clear();        LatLng latLng = null;        OverlayOptions overlayOptions = null;        Marker marker = null;        //遍历添加覆盖物信息        for (Info info : infos){            // 位置            latLng = new LatLng(info.getLatitude(), info.getLongitude());            // 覆盖物的图标            BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.mipmap.map_pos_icon);            overlayOptions = new MarkerOptions().position(latLng).icon(bitmap).zIndex(5);            marker = (Marker) (mBaiduMap.addOverlay(overlayOptions));//core            //为marker带上数据            Bundle bundle = new Bundle();            bundle.putSerializable("info", info);            marker.setExtraInfo(bundle);        }//        // 可选操作 将地图移到到最后一个经纬度位置        MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(latLng);        mBaiduMap.setMapStatus(u);    }

Info是封装了经纬度等扩展信息的的一个实体类。我将其设置进一个按钮的点击事件,一点击该按钮就触发这个方法用于模拟服务器拉取到的数据,执行完成后地图上应该就添上了若干个覆盖物了。具体的可以看demo内的代码。

2.marker的点击事件:

先来个原生态的,这样方便理解。

        mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {            @Override            public boolean onMarkerClick(final Marker marker) {                Log.e("marker click","     marker  >>  " + marker.getId());                return true;            }        });

没啥可说的,注意API就行了,就是注意他这个是用mBaiduMap这个对象对整张地图的marker进行点击的设置。一旦设置,全图生效。

然后我们看在添加覆盖物的时候,我们为覆盖物都设置了一个bundle数据——info。那么我们来改造下。

        mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {            @Override            public boolean onMarkerClick(final Marker marker) {// Log.e("marker click","     marker  >>  " + marker.getId());                Bundle extraInfo = marker.getExtraInfo();                Info info = (Info) extraInfo.getSerializable("info");                String name = info.getName();                Log.e("marker click","     name  >>  " + name);                return true;            }        });

Log输出:我们把marker携带的数据给取出来,并打印出了名字。

11-20 11:13:18.371 32645-32645/zj.shitmap E/marker click:      name  >>  老米家泡馍小炒11-20 11:13:19.107 32645-32645/zj.shitmap E/marker click:      name  >>  老米家泡馍小炒11-20 11:13:22.701 32645-32645/zj.shitmap E/marker click:      name  >>  沙井国际洗浴会所11-20 11:13:26.035 32645-32645/zj.shitmap E/marker click:      name  >>  英伦贵族小旅馆11-20 11:13:28.890 32645-32645/zj.shitmap E/marker click:      name  >>  五环服装城

从上而知,既然marker能携带数据,那么我们便可以以此为支点,做很多事情。比如弹出一个底部详情布局(利用marker携带的数据),也可以弹出一个infoWindow。

基于熟悉api和控件的考虑,我们利用marker的点击来弹出一个infoWindow吧。

3.InfoWindow:

核心代码:

   /**                 * 显示infoWindow                 */                mBaiduMap.hideInfoWindow();                InfoWindow.OnInfoWindowClickListener listener = new InfoWindow.OnInfoWindowClickListener() {                    @Override                    public void onInfoWindowClick() {                        Log.e("marker click","     点击Marker  >>  ");                    }                };                RelativeLayout fathersRootView = (RelativeLayout) findViewById(R.id.activity_main);                RelativeLayout popupCommonClickRelativeLayout = (RelativeLayout) LayoutInflater.from(getBaseContext())                        .inflate(R.layout.map_infowindow_common,                                fathersRootView,                                false);                TextView subText = (TextView) popupCommonClickRelativeLayout.findViewById(R.id.infowindow_common_click_name);                subText.setText(name);                InfoWindow window = new InfoWindow(BitmapDescriptorFactory.fromView(popupCommonClickRelativeLayout),                        marker.getPosition(),                        -100,                        listener);                mBaiduMap.showInfoWindow(window);

注意在设置infoWindow的textView信息,必须要在addInfoWindow之前。否则设置不生效。

这段代码时写在marker的点击事件内的,所以一点击的时候,将数据拿出来,设置到infoWindow所依赖的view上边,然后再将该View加入到infoWwindow。

4.最后附上Demo:

demo下载

原创粉丝点击