[baidu] 05_百度地图加强_覆盖物_ItemizedOverlay分条目以及点击冒出泡泡

Android 4.0

百度地图加强_覆盖物_ItemizedOverlay

ItemizedOverlay 1
public class ItemizedOverlay<Item extends OverlayItem自定义覆盖物或标注管理类

通过ItemizedOverlay可以向地图添加一个或多个自定义覆盖物或标注。

添加覆盖物的一般流程:
1. 用OverlayItem 准备overlay数据。
2. 创建ItemizedOverlay实例,调用 addItem(OverlayItem) 接口添加overlay. 
3. 若一次性添加的overlay数据较多,可以使用 addItem(List) 接口. 
3. 调用MapView.getOverlays().add()方法添加overlay到mapview中。
4. 调用MapView.refresh() 使Overlay生效。

①public ItemizedOverlay(Drawable defaultMarker,MapView mapView)  创建一个新的ItemizedOverlay

defaultMarker - item默认显示在地图上的的Drawable,为了正确绘制标记点,需要给它添加边界,例如boundCenterBottom(marker))

②public class OverlayItem   表示单个overlay数据,如自定义标注,建筑等。

OverlayItem是ItemizedOverlay的基本组件,OverlayItem存储的overlay数据通过ItemizedOverlay添加到地图中。

public OverlayItem(GeoPoint point, java.lang.String title, java.lang.String snippet)

核心代码:
package cn.zengfansheng.mybaidumap.overlay;
import java.util.List;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import cn.zengfansheng.mybaidumap.BaseActivity;
import cn.zengfansheng.mybaidumap.R;
import com.baidu.mapapi.map.ItemizedOverlay;
import com.baidu.mapapi.map.Overlay;
import com.baidu.mapapi.map.OverlayItem;
import com.baidu.platform.comapi.basestruct.GeoPoint;
/**
 * 多条目绘制
 */
public class extends BaseActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        drawItemizedOverlay();
    }
    /**
     * 画分条目的覆盖物
     */
    private void drawItemizedOverlay() {
        // 1、获取到Overlay集合
        List<Overlay> overlays = mMapView.getOverlays();
        // 2、针对每个要展示的Overlay设置数据
        Drawable defaultMarker =  getResources().getDrawable(R.drawable.eat_icon);
        ItemizedOverlay<OverlayItem> overlay = new ItemizedOverlay<OverlayItem>(defaultMarker, mMapView);
        seItemizedOverlaytData(overlay);
        // 添加绘制到集合当中
        overlays.add(overlay);
        // 3、刷新界面
        mMapView.refresh();
    }
    private void seItemizedOverlaytData(ItemizedOverlay<OverlayItem> overlay) {
        // 添加覆盖物的一般流程:
        // 1. 用OverlayItem 准备overlay数据。
        // 2. 创建ItemizedOverlay实例,调用 addItem(OverlayItem) 接口添加overlay.
        // 3. 若一次性添加的overlay数据较多,可以使用 addItem(List) 接口.
        // 3. 调用MapView.getOverlays().add()方法添加overlay到mapview中。
        // 4. 调用MapView.refresh() 使Overlay生效。
        
        //OverlayItem(GeoPoint point, java.lang.String title, java.lang.String snippet) 
        OverlayItem overlayItem = new OverlayItem(geoPoint"小胜地图title""片段:snippet");
        overlay.addItem(overlayItem);
        
        
        overlayItem = new OverlayItem(new GeoPoint(latitudeE6 + 10000, longitudeE6), "向北""增加纬度");
        overlay.addItem(overlayItem);
        overlayItem = new OverlayItem(new GeoPoint(latitudeE6longitudeE6 + 10000), "向东""增加经度");
        overlay.addItem(overlayItem);
        overlayItem = new OverlayItem(new GeoPoint(latitudeE6 - 10000, longitudeE6 - 10000), "向西南""减少经纬度");
        overlay.addItem(overlayItem);
    }
}
结果:



点击该OverlayItem,可以弹出来一个自定义View对象出来

1、ItemizedOverlay<Item extendsOverlayItem>
① protected boolean onTap(int index)  覆盖这个方法去处理一个item上的点击事件。 这可能是对屏幕上item的触摸点击,或者对位于中心且已选定的item的跟踪球点击。默认情况下,什么都不做,返回false
返回:如果点击事件被处理,返回true;如果想要把这个事件传递给其它overlay,返回false
② public final OverlayItem getItem(int position) 获取定索引对应的OverlayItem
③ public boolean updateItem(OverlayItem item) 需要更新的item,item需之前被add到overlay中才能被更新.

2、OverlayItem 表示单个overlay数据,如自定义标注,建筑等。
OverlayItem是ItemizedOverlay的基本组件,OverlayItem存储的overlay数据通过ItemizedOverlay添加到地图中。

3、创建自定义布局参数,按地理坐标布局
public MapView.LayoutParams(int width,    要显示的view的宽
                            int height,  要显示的view的高
                            GeoPoint point, 自定义view将要添加到的位置(使用地理位置坐标表示)
                            int alignment) 对齐方式
核心代码:
package cn.zengfansheng.mybaidumap.overlay;
import java.util.List;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import cn.zengfansheng.mybaidumap.BaseActivity;
import cn.zengfansheng.mybaidumap.R;
import com.baidu.mapapi.map.ItemizedOverlay;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MapView.LayoutParams;
import com.baidu.mapapi.map.Overlay;
import com.baidu.mapapi.map.OverlayItem;
import com.baidu.platform.comapi.basestruct.GeoPoint;
/**
 * 多条目绘制
 */
public class ItemizedOverlayDemo extends BaseActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initPop();
        drawItemizedOverlay();
    }
    // NOTES=========3、点击一个OverlayItem时,弹出来一个pop============
    private View view;
    private TextView tvTitle;// 标题
    /**
     * 初始化pop
     */
    private void initPop() {
        view = View.inflate(getApplication(), R.layout.popnull);

        tvTitle = (TextView) view.findViewById(R.id.tv_title);
        // 将该view添加到显示地图的MapView中去,要使用MapView中的LayoutParams,里面有特有的方法
        //MapView.LayoutParams params = new MapView.LayoutParams(view.getWidth(), view.getHeight(),
                //null, com.baidu.mapapi.map.MapView.LayoutParams.BOTTOM_CENTER);
        MapView.LayoutParams params = new MapView.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
        null, LayoutParams.BOTTOM_CENTER);

        mMapView.addView(view, params);
        // 默认不可见
        view.setVisibility(View.GONE);
    }
    // NOTES===========================2、画分条目的覆盖物===========================
    /**
     * 画分条目的覆盖物
     */
    private void drawItemizedOverlay() {

        // 1、获取到Overlay集合
        List<Overlay> overlays = mMapView.getOverlays();

        // 2、针对每个要展示的Overlay设置数据
        // ItemizedOverlay类似一个List集合
        Drawable defaultMarker =  getResources().getDrawable(R.drawable.eat_icon);
        ItemizedOverlay<OverlayItem> overlay = new ItemizedOverlay<OverlayItem>(defaultMarker, mMapView){
            // 当一个条目被点击时
            @Override
            protected boolean onTap(int index) {
                OverlayItem item = this.getItem(index);
                
                String title = item.getTitle();
                // String snippet = item.getSnippet();
                tvTitle.setText(title);
                // 当被点击时,可见
                view.setVisibility(View.VISIBLE);
                MapView.LayoutParams params = new MapView.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
                        item.getPoint(), LayoutParams.BOTTOM_CENTER);
                System.out.println("view:"+view.getWidth() + ":" + view.getHeight());
                System.out.println("layout:"+LayoutParams.WRAP_CONTENT+":"+LayoutParams.WRAP_CONTENT);
                // FIXME:注意view.getWidth()和LayoutParams.WRAP_CONTENT区别,前者会导致显示不完全
//                MapView.LayoutParams params = new MapView.LayoutParams(view.getWidth(), view.getHeight(),
//                        item.getPoint(), com.baidu.mapapi.map.MapView.LayoutParams.BOTTOM_CENTER);
                mMapView.updateViewLayout(view, params);
                return super.onTap(index);
                // 如果点击事件被处理,返回true;如果想要把这个事件传递给其它overlay,返回false
            }
        };
        seItemizedOverlaytData(overlay);
        // 添加绘制到集合当中
        overlays.add(overlay);
        // 3、刷新界面
        mMapView.refresh();
    }
    // NOTES======================1、设置ItemizedOverlay的条目数据==================
    /**
     * 设置ItemizedOverlay的条目数据
     * @param overlay
     */
    private void seItemizedOverlaytData(ItemizedOverlay<OverlayItem> overlay) {
        // 添加覆盖物的一般流程:
        // 1. 用OverlayItem 准备overlay数据。
        // 2. 创建ItemizedOverlay实例,调用 addItem(OverlayItem) 接口添加overlay.
        // 3. 若一次性添加的overlay数据较多,可以使用 addItem(List) 接口.
        // 3. 调用MapView.getOverlays().add()方法添加overlay到mapview中。
        // 4. 调用MapView.refresh() 使Overlay生效。
        
        //OverlayItem(GeoPoint point, java.lang.String title, java.lang.String snippet) 
        OverlayItem overlayItem = new OverlayItem(geoPoint"小胜地图title""片段:snippet");
        overlay.addItem(overlayItem);
        
        
        overlayItem = new OverlayItem(new GeoPoint(latitudeE6 + 10000, longitudeE6), "向北""增加纬度");
        overlay.addItem(overlayItem);
        overlayItem = new OverlayItem(new GeoPoint(latitudeE6longitudeE6 + 10000), "向东""增加经度");
        overlay.addItem(overlayItem);
        overlayItem = new OverlayItem(new GeoPoint(latitudeE6 - 10000, longitudeE6 - 10000), "向西南""减少经纬度");
        overlay.addItem(overlayItem);
    }
}
结果:
源码: