在百度地图上重新覆盖标记图层
当图层功能相同,只是位置和图层样式不同时,使用自定义的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包

浙公网安备 33010602011771号