Android 添加自定义图层,图层中可带链接


在Android中添加图层的方法,一般来说是定义一个overlay对象,比如说属于MyOverlay类,MyOverlay是继承于ItemizedOverlay<Item>的,然后定义一个overlayitem,继承于OverLayItem,在使用的时候就是新建一个overlayitem对象,overlayitem =new overlayitem (GeoPoint point, String directiondir, String routetag),point包含了这个点的经纬度,后面两个数据就是你在点击这个点的时候可以显示的数据,当然至于你想怎么显示就看每个人不同的想法了。overlay在定义的时候会传入一个图片参数,以便显示,然后就是把overlayitem对象加到overlay中,在点击图片的时候会调用MyOverlay中的OnTop方法。至于我们要显示的两个信息,就是overlayitem对象中的后两个参数,我们可以根据点击时得到的index来创建一个item,然后调用item的gettitle  getsnippet方法来获得两个参数。
下面是添加自定义图层,不是简单的显示一个图标,但是这次这个也只是一个框架,还没完全实现

这里有这么一个关系,BusOverlay继承于BalloonItemizedOverlay<BusOverlayItem>,这个又继承于ItemizedOverlay<Item>,对于BusOverlayItem,它继承与OverlayItem,首先

  1. BusOverlay BusOverlay = new BusOverlay(drawable, this, stoptagList,mapView,density,style);  
  2. BusOverlayItem overlayitem = new BusOverlayItem(point,"测试数据","测试数据");  
  3. BusOverlay.addOverlay(overlayitem);  

简单的写下创建两个对象,然后将这个BusOverlayItem传递到BusOverlay中。刚才说到BusOverlayItem的后面两个参数是点击时显示数据的地发,这里为什么用测试数据呢,我们待会再说。然后我们进入OnTop方法,在点击图层的时候,

  1. boolean ret=BusOverlay.super.onTap(index);  

我们先返回他父类的OnTop方法,这里我们要显示的弹出框用的是FrameLayout类型的对象,FrameLayout就是可以显示弹出框的那种样式的嘛,我们新建一个BalloonoverLayView <Item extends OverlayItem>,继承与FrameLayout,再创建一个BusPopupView,这个类的对象就是我们要显示的框实体。

  1. protected BalloonoverLayView<Item> balloonView;//矩形提示框  

在OnTop方法中,如果这个类对象是空的话,我们就去创建这样的一个实体。

  1. if (balloonView == null)   
  2.     balloonView = createBalloonOverlayView();  

在creatBalloonOverlayView方法中我们新建

  1. BusPopupView view = new BusPopupView(getMapView().getContext(),getBalloonBottomOffset(),density,sb);  

参数我们先不管,这个类必然会调用BalloonoverLayView<Item>的构造函数,

在BalloonoverLayView<Item>的构造函数中,

  1. protected LinearLayout layout; private TextView title; private TextView snippet; protected View layoutView; protected float density; private StringBuffer sb;  
  2. public BalloonoverLayView(Context context, int balloonBottomOffset,float density,StringBuffer sb) {  
  3.   super(context);  
  4.     
  5.   this.density = density;  
  6.   this.sb=sb;  
  7.   setPadding(10010, balloonBottomOffset);//设置位置   
  8.   layout = new LinearLayout(context);  
  9.   layout.setVisibility(VISIBLE);  
  10.   
  11.   LayoutInflater inflater = (LayoutInflater) context  
  12.     .getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  13.   //这一步先加载了弹出框的布局   
  14.   layoutView = inflater.inflate(R.layout.balloon_map_overlay, layout);  
  15.     
  16.   //弹出框中的两行信息,可见R.id.balloon_item_title框图中   
  17.   title = (TextView) layoutView.findViewById(R.id.balloon_item_title);  
  18.   snippet = (TextView) layoutView.findViewById(R.id.balloon_item_snippet);  
  19.   System.out.println("布局加载都好了");  
  20.   
  21.  }  

有些参数不是为了框架的搭建,我们先不讲,为了从xml文件中直接引入我们的大致框架,用到layoutView = inflater.inflate(R.layout.balloon_map_overlay, layout);,根据文档中创建layout。说明下,title和snippet是xml文件中的两个控件,为了显示上面文字用的。父类构造结束,我们回到BusPopupView的构造函数中,

  1. FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(  
  2.     LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);  
  3. params.gravity = Gravity.NO_GRAVITY;  
  4. addView(layout, params);  

在子类中把刚才处理过的layout拿过来,继承父类的数据嘛,添加到视图中,此时BusPopupView的构造函数也结束了,那就返回了一个view嘛

BusPopupView view = new BusPopupView(getMapView().getContext(),getBalloonBottomOffset(),density,sb);
if (balloonView == null)
 balloonView = createBalloonOverlayView();
这个view就是由ballooView接受。

  1. GeoPoint point = currentFocussedItem.getPoint();  
  2.   MapView.LayoutParams params = new MapView.LayoutParams(  
  3.     LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, point,  
  4.     MapView.LayoutParams.BOTTOM_CENTER);  
  5.   params.mode = MapView.LayoutParams.MODE_MAP;  
 
  1. //使得弹出框可见   
  2.   balloonView.setVisibility(View.VISIBLE);  
  3.   mapView.addView(balloonView, params);  

我们只讲显示弹出框的框架,所以上面点击以后触发的方法就不写了,至于其他方法以后再写吧。还是一嘛

把刚才的视图传进来的balloonView 设置一下参数,然后将这个视图加载mapview中。mapview是在构造函数中传进来的,就是主窗口中的mapview。

相关内容