Android 百度地图API-----气泡显示

来源:互联网 发布:编程语言和编译器 编辑:程序博客网 时间:2024/04/30 03:21

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

先来看看效果:


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>

0 0