地图气泡加文字

public List<OverlayItem> mGeoList = new ArrayList<OverlayItem>();
private Drawable marker;
private Activity mContext;
View mPopView = null; // 这个View是来显示界面效果,显示数据从list获取
MapView mMapView;
List<?> list; // List<?> list; 传值过来任何集合数据,不仅仅是构成mGeoList,也是mPopView,显示的信息集合。想传什么就传什么,只要确保必须有个Geopoint
 
public MyOverlay(Drawable marker, Activity context, MapView mMapView, List<?> list) {
    super(boundCenterBottom(marker)); // 这个比较重要,防止地图放大缩小的时候,便宜的
    this.marker = marker;
    this.mContext = context;
    this.mMapView = mMapView;
    this.list = list;
    addIteam();// 添加OverlayItem
    mPopView = mContext.getLayoutInflater().inflate(R.layout.popview, null);
    mMapView.addView(mPopView, new MapView.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, null,
            MapView.LayoutParams.TOP_LEFT));
    mPopView.setVisibility(View.GONE);
    populate(); // createItem(int)方法构造item。一旦有了数据,在调用其它方法前,首先调用这个方法
}
 
private void addIteam() {
    // public OverlayItem(GeoPoint point,
    // java.lang.String title,
    // java.lang.String snippet) //OverlayItem 构造方法
    // new GeoPoint((int) (mLat3 * 1E6), (int) (mLon3 * 1E6));MKPoiResult
 
    int listSize = list.size();
    for (int i = 0; i < listSize; i++) {
        GeoPoint geoPoint = ((List<MKPoiInfo>) list).get(i).pt;
        String title = ((List<MKPoiInfo>) list).get(i).name;
        String snippet = ((List<MKPoiInfo>) list).get(i).address;
        mGeoList.add(new OverlayItem(geoPoint, title, snippet));
    }
}
 
public void updateOverlay() { // 这个也是比较重要的方法的,慎用
    populate();
}
 
@Override
protected OverlayItem createItem(int i) {
    mGeoList.get(i).setMarker(new BitmapDrawable(mContext.getResources(), markerBitmap(i)));
    return mGeoList.get(i);
}
 
String s = "ABCDEFGHIJKLMNOPQWSXYZ";
String ss = "骚年祝福激情燃烧其中有个猥琐滴";
 
private Bitmap markerBitmap(int i) {
 
    Bitmap bmp = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.icon_marki_h);
    Bitmap newb = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), Config.ARGB_8888);
    Canvas canvasTmp = new Canvas(newb);
    canvasTmp.drawColor(Color.TRANSPARENT);
    Paint p = new Paint();
    p.setColor(Color.WHITE);
    p.setTextSize(18);
    canvasTmp.drawBitmap(bmp, 0, 0, p);
    canvasTmp.drawText(ss.charAt(i) + "", bmp.getWidth() / 7, bmp.getHeight() / 7 * 4, p);
    canvasTmp.save(Canvas.ALL_SAVE_FLAG);
    canvasTmp.restore();
    return newb;
}
 
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
 
    // Projection接口用于屏幕像素坐标和经纬度坐标之间的变换
    Projection projection = mapView.getProjection();
    for (int index = size() - 1; index >= 0; index--) { // 遍历mGeoList
        OverlayItem overLayItem = getItem(index); // 得到给定索引的item
 
        String title = overLayItem.getTitle();
        // 把经纬度变换到相对于MapView左上角的屏幕像素坐标
        Point point = projection.toPixels(overLayItem.getPoint(), null);
        // 可在此处添加您的绘制代码
        // Paint paintText = new Paint();
        // paintText.setColor(Color.BLUE);
        // paintText.setTextSize(15);
        // canvas.drawText(title, point.x - 30, point.y, paintText); // 绘制文本
    }
    super.draw(canvas, mapView, shadow);
    // 调整一个drawable边界,使得(0,0)是这个drawable底部最后一行中心的一个像素
    boundCenterBottom(marker);
}
 
@Override
public int size() {
    return mGeoList.size();
}
 
protected boolean onTap(int i) {
    setFocus(mGeoList.get(i));
    // 更新气泡位置,并使之显示
    GeoPoint pt = mGeoList.get(i).getPoint();
    mMapView.updateViewLayout(mPopView, new MapView.LayoutParams(LayoutParams.WRAP_CONTENT,
            LayoutParams.WRAP_CONTENT, pt, MapView.LayoutParams.BOTTOM_CENTER));
    mPopView.setVisibility(View.VISIBLE);
 
    Toast.makeText(this.mContext, mGeoList.get(i).getSnippet(), Toast.LENGTH_SHORT).show();
    return true;
}
 
@Override
public boolean onTap(GeoPoint arg0, MapView arg1) {
    // TODO Auto-generated method stub
    // 消去弹出的气泡
    mPopView.setVisibility(View.GONE);
    return super.onTap(arg0, arg1);
}
posted @ 2013-03-20 14:44  xxdc  阅读(277)  评论(0编辑  收藏  举报