在百度地图上重新覆盖标记图层

当图层功能相同,只是位置和图层样式不同时,使用自定义的ItemizedOverlay<OverlayItem>子类。

在其构造函数中首先调用super(boundCenterBottom(图层drawable))。

设置标记的图层样式。

之后将对应格式的数据装入到成员变量容器中,容器元素为OverlayItem

装入完毕后一定要调用populate()方法。估计是做创建OverlayItem前的初始化工作。

重写createItem(int location)(估计和ListView原理相似)

如果有点击,触摸等事件,需要重写对应的方法,什么onTap,onTouch之类的。

一般情况下都会有相应的点击事件。

在建立容器的时候,将数据容器与点信息一一对应,在点击时调取其对应的数据进行处理。

下面上代码,自己写的demo。

package com.eliyet;

import java.util.ArrayList;
import java.util.List;

import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.GeoPoint;
import com.baidu.mapapi.ItemizedOverlay;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.MapActivity;
import com.baidu.mapapi.MapController;
import com.baidu.mapapi.MapView;
import com.baidu.mapapi.Overlay;
import com.baidu.mapapi.OverlayItem;

import android.app.Activity;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class MapViewTestActivity extends MapActivity {
    private BMapManager mBMapManager;
    private MapView mMapview;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mBMapManager = new BMapManager(getApplication());
        mBMapManager.init("EDD5660E5E63D6266071CBEFF348ED5357C46C5A",
                new MKGeneralListener() {

                    public void onGetPermissionState(int arg0) {
                        Log.e("注册——网络错误", "错误代码:" + arg0);
                    }

                    public void onGetNetworkState(int arg0) {
                        Log.e("注册——KEY错误", "错误代码:" + arg0);
                    }
                });
        super.initMapActivity(mBMapManager);
        mMapview = (MapView) findViewById(R.id.bai_map);
        mMapview.setBuiltInZoomControls(true);
        MapController controller = mMapview.getController();
        GeoPoint geoPoint = new GeoPoint((int) (39.915 * 1E6),// 填写自己的当前坐标(注意要在获取后执行)
                (int) (116.404 * 1E6));
        controller.setCenter(geoPoint);// 设定以所给点为中心
        controller.setZoom(12);
        mMapview.getOverlays().add(new TestOverlays(39.915, 116.404, mMapview) {

            @Override
            public boolean onTap(GeoPoint geoPoint, MapView mapView) {
                Log.e("ontap", "点击");
                return super.onTap(geoPoint, mapView);
            }
        });
        Drawable markDraw = getResources().getDrawable(R.drawable.ic_launcher);
        mMapview.getOverlays().add(new OverLaysList(markDraw));
    }

    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }

    @Override
    protected void onDestroy() {
        if (mBMapManager != null) {
            mBMapManager.destroy();
            mBMapManager = null;
        }
        super.onDestroy();
    }

    @Override
    protected void onPause() {
        mBMapManager.stop();
        super.onPause();
    }

    @Override
    protected void onResume() {
        mBMapManager.start();
        super.onResume();
    }

    public void onClickSatellite(View view) {
        mMapview.setSatellite(true);
    }

    public void onClickNormalMap(View view) {
        mMapview.setSatellite(false);
    }

    private class TestOverlays extends Overlay {
        private Paint paint = new Paint();
        private MapView mapView;

        private GeoPoint geoPoint;

        public TestOverlays(double lon, double lat, MapView mapView) {
            geoPoint = new GeoPoint((int) (lon * 1E6), (int) (lat * 1E6));
            this.mapView = mapView;
        }

        public Paint getPaint() {
            return paint;
        }

        @Override
        public void draw(Canvas canvas, MapView view, boolean arg2) {
            Point point = mapView.getProjection().toPixels(geoPoint, null);// point只能建在这个方法里,如果为成员变量则值是不正确的。
            Log.e("draw", point.x + " " + point.y);
            canvas.drawBitmap(BitmapFactory.decodeResource(getResources(),
                    R.drawable.ic_launcher), point.x, point.y, paint);
        }

    }

    private class OverLaysList extends ItemizedOverlay<OverlayItem> {
        private List<OverlayItem> markList;
        private double mLat1 = 39.90923;// 39.9022; // point1纬度
        private double mLon1 = 116.397428;// 116.3822; // point1经度

        private double mLat2 = 39.9022;
        private double mLon2 = 116.3922;

        private double mLat3 = 39.917723;
        private double mLon3 = 116.3722;

        public OverLaysList(Drawable arg0) {
            super(boundCenterBottom(arg0));// 设定标记图案
            markList = new ArrayList<OverlayItem>();
            markList.add(new OverlayItem(new GeoPoint((int) (mLat1 * 1E6),
                    (int) (mLon1 * 1E6)), "P1", "point1"));
            markList.add(new OverlayItem(new GeoPoint((int) (mLat2 * 1E6),
                    (int) (mLon2 * 1E6)), "P2", "point2"));
            markList.add(new OverlayItem(new GeoPoint((int) (mLat3 * 1E6),
                    (int) (mLon3 * 1E6)), "P3", "point3"));
            populate();// (估计是刷新数据的方法,之后会对应容器会将其元素刷新)
        }

        @Override
        protected OverlayItem createItem(int arg0) {
            return markList.get(arg0);
        }

        @Override
        public int size() {
            return markList.size();
        }

    }

}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="onClickSatellite"
            android:text="卫星" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="onClickNormalMap"
            android:text="地图" />
    </LinearLayout>

    <com.baidu.mapapi.MapView
        android:id="@+id/bai_map"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true" />

</LinearLayout>

所导入的jar包