android 百度地图 三、气泡显示

来源:互联网 发布:linux内网端口转发工具 编辑:程序博客网 时间:2024/04/30 04:46

一个小例子,在地图中显示一个浮标,显示出我们的标记点,点击这个浮标会出现一个文本显示的气泡

先来看看效果:

Android 百度地图API学习(五)-----气泡显示 - quanquan127@126 - 学无止境

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>