一个小例子,在地图中显示一个浮标,显示出我们的标记点,点击这个浮标会出现一个文本显示的气泡
先来看看效果:
public class MainActivity extends MapActivity { BMapManager mBMapMan; MapController mMapController; MKOfflineMap mOffline = null; //申明变量 离线地图 static View mPopView = null; // 点击mark时弹出的气泡View MyOverItemT overitem = null; MapView mMapView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); GeoPoint point = new GeoPoint((int) ( 22.560034 * 1E6),(int) (113.940657 * 1E6)); List<GeoPoint> lgp=new ArrayList<GeoPoint>(); lgp.add(point); //BMapManager的注册和初始化 mBMapMan = new BMapManager(getApplication()); mBMapMan.init("3B388F2271D0255A779274772B906055B2942035", null); mBMapMan.start(); super.initMapActivity(mBMapMan); //mapview地图控件的设置 mMapView = (MapView) findViewById(R.id.bmapsView); mMapView.setBuiltInZoomControls(true); // mMapView.setDrawOverlayWhenZooming(true);//在地图缩放的过程里绘制 mMapView.getController().setCenter(point);//将指定点作为地图的中心显示出来 //标记 Drawable marker = getResources().getDrawable(R.drawable.iconmarka); //为maker定义位置和边界 marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker.getIntrinsicHeight()); //这是在点击了标记之后,弹出的浮动窗口 mPopView=super.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); overitem=new MyOverItemT(marker,this,lgp); mMapView.getOverlays().add(overitem); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } @Override protected void onDestroy() { if (mBMapMan != null) { mBMapMan.destroy(); mBMapMan = null; } super.onDestroy(); } @Override protected void onPause() { if (mBMapMan != null) { mBMapMan.stop(); } super.onPause(); } @Override protected void onResume() { if (mBMapMan != null) { mBMapMan.start(); } super.onResume(); }
@Override protected boolean isRouteDisplayed() { // TODO Auto-generated method stub return false; } }
自定义图层类:
图标的布局样式:class MyOverItemT extends ItemizedOverlay<OverlayItem> { public List<OverlayItem> mGeoList = new ArrayList<OverlayItem>(); private Drawable marker;//标记 private MainActivity ma;//上下文 public List<GeoPoint> gpl = new ArrayList<GeoPoint>(); Projection projection; //初始化,生成图层的item。 public MyOverItemT(Drawable marker, MainActivity context, List<GeoPoint> gplist) { super(boundCenterBottom(marker)); this.marker=marker; this.ma=context; //根据gplist来制作OverlayItem for(int i=0;i<gplist.size();i++){ GeoPoint gp=(GeoPoint)gplist.get(i); OverlayItem ot=new OverlayItem(gp,"gp"+i,"gpoint"+i); mGeoList.add(ot); } populate();//更新 } //核心的方法 1 draw:将图层上的item绘制出来 2 onTap:触发每个item的时候响应动作 @Override public void draw(Canvas canvas, MapView mapView, boolean shadow) { //将List<OverlayItem> mGeoList 全部绘制出来 // Projection接口用于屏幕像素坐标和经纬度坐标之间的变换 projection = mapView.getProjection(); //得到OverlayItem,然后转换成point点 //然后根据这个点绘制 for (int index = size() - 1; index >= 0; index--) { OverlayItem overLayItem = getItem(index); String title = overLayItem.getTitle(); Point point = projection.toPixels(overLayItem.getPoint(), null); Paint paintText = new Paint(); paintText.setColor(Color.RED); paintText.setTextSize(15); canvas.drawText(title, point.x-30, point.y, paintText); // 绘制文本 } super.draw(canvas, mapView, shadow); boundCenterBottom(marker); } @Override public boolean onTap(GeoPoint arg0, MapView arg1) { //浮标消失 ma.mPopView.setVisibility(View.GONE); return super.onTap(arg0, arg1); } @Override protected boolean onTap(int i) { //首先 某一个item获得焦点 //然后将标记图标的view 加入到mapview中 setFocus(mGeoList.get(i)); GeoPoint pt = mGeoList.get(i).getPoint(); Point pn=projection.toPixels(pt, null); ma.mMapView.updateViewLayout( ma.mPopView, new MapView.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, pt, MapView.LayoutParams.BOTTOM_CENTER)); ma.mPopView.setVisibility(View.VISIBLE); //得到坐标然后显示出来 TextView tv1=(TextView)ma.mMapView.findViewById(R.id.tv1); tv1.setText("经纬度:"+pt.getLongitudeE6()/1e6+","+pt.getLatitudeE6()/1e6); TextView tv2=(TextView)ma.mMapView.findViewById(R.id.tv2); tv2.setText("坐标:"+pn.x+","+pn.y); return true; } @Override protected OverlayItem createItem(int arg0) { // TODO Auto-generated method stub return mGeoList.get(arg0); }
@Override public int size() { // TODO Auto-generated method stub return mGeoList.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="horizontal" android:paddingBottom="25dip" >
<LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/pop" android:orientation="vertical" >
<TextView android:id="@+id/tv1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="坐标" />
<TextView android:id="@+id/tv2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="x,y" /> </LinearLayout>
</LinearLayout>