自定义叠加图文字和图片参考文章

12.1.3  Google Maps实战:漂亮的气泡地图(2)

第三步,自定义一个ItemizedOverlay用来标识景点的图标和文字的图层。主要对该图层进行重新绘制,来达到想要的效果。

 
 
  1. public class MyItemizedOverlay extends ItemizedOverlay<OverlayItem>{  
  2.      private ArrayList<OverlayItem> overlayItemList = new ArrayList<OverlayItem>();    
  3.         private Context context;    
  4.     public MyItemizedOverlay(Context context,Drawable defaultMarker) {  
  5.         super(defaultMarker);  
  6.         this.context=context;  
  7.           
  8.     }  
  9.  
  10.     @Override  
  11.     public void draw(Canvas canvas, MapView mapView, boolean shadow) {  
  12.         super.draw(canvas, mapView, shadow);  
  13.         // Projection接口用于屏幕像素点坐标系统和地球表面经纬度点坐标系统之间的变换    
  14.         Projection projection = mapView.getProjection();    
  15.         // 遍历所有的OverlayItem    
  16.         for (int index = this.size() - 1; index >= 0; index--) {    
  17.             // 得到给定索引的item    
  18.             OverlayItem overLayItem = getItem(index);    
  19.     
  20.             // 把经纬度变换到相对于MapView左上角的屏幕像素坐标    
  21.             Point point = projection.toPixels(overLayItem.getPoint(), null);    
  22.     
  23.             Paint paintText = new Paint();    
  24.             paintText.setColor(Color.RED);    
  25.             paintText.setTextSize(13);    
  26.             // 绘制文本    
  27.             canvas.drawText(overLayItem.getTitle(), point.x + 10, point.y - 15, paintText);    
  28.         }  
  29.           
  30.     }  
  31.  
  32.     @Override  
  33.     protected boolean onTap(int index) {  
  34.         // TODO Auto-generated method stub  
  35.         setFocus(overlayItemList.get(index));   
  36.         return super.onTap(index);  
  37.     }  
  38.  
  39.     @Override    
  40.     protected OverlayItem createItem(int i) {    
  41.         return overlayItemList.get(i);    
  42.     }    
  43.     
  44.     @Override    
  45.     public int size() {    
  46.         return overlayItemList.size();    
  47.     }    
  48.     
  49.     public void addOverlay(OverlayItem overlayItem) {    
  50.         overlayItemList.add(overlayItem);    
  51.         this.populate();    
  52.     }  
  53.  
  54. }  

第四步,实现自己的PopMapActivity,先在地图上根据两景点经纬度创建位置,并以自定义的图标和文字进行标识,给自定义的ItemizedOverlay添加焦点改变事件监听,来完成气泡View的显示和隐藏效果。
 
 
  1. public class PopMapActivity extends MapActivity {  
  2.     /**  
  3.      * 地图View  
  4.      */  
  5.     protected MapView mapView;  
  6.     /**  
  7.      * 弹出的气泡View  
  8.      */  
  9.     private View popView;  
  10.  
  11.     public void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.  
  14.         // 初始化气泡,并设置为不可见  
  15.         popView = View.inflate(this, R.layout.popview, null);  
  16.         setContentView(R.layout.mymapview);  
  17.         mapView = (MapView) findViewById(R.id.map_view);  
  18.         mapView.addView(popView, new MapView.LayoutParams(  
  19.                 MapView.LayoutParams.WRAP_CONTENT,  
  20.                 MapView.LayoutParams.WRAP_CONTENT, null,  
  21.                 MapView.LayoutParams.BOTTOM_CENTER));  
  22.         // 由于气泡的尾巴是在下边居中的,因此要设置成  
  23. MapView.LayoutParams.BOTTOM_CENTER.  
  24.         // 这里没有给GeoPoint,在onFocusChangeListener中设置  
  25.         popView.setVisibility(View.GONE);  
  26.         /**  
  27.          * 创建图标资源(用于显示在overlayItem所标记的位置)  
  28.          */  
  29.         Drawable drawable = this.getResources().getDrawable(  
  30.                 R.drawable.mis_usemobile);  
  31.         // 为maker定义位置和边界  
  32.         drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),  
  33.                 drawable.getIntrinsicHeight());  
  34.         MyItemizedOverlay overlay = new MyItemizedOverlay(this, drawable);  
  35.         // 设置显示/隐藏气泡的监听器  
  36.         overlay.setOnFocusChangeListener(onFocusChangeListener);  
  37.         /**  
  38.          * 创建并添加第一个标记:深圳 世界之窗(经度:22.5348 纬度:113.97246)  
  39.          */  
  40.         // 构造一个经纬度点  
  41.         GeoPoint point = new GeoPoint((int) (22.5348 * 1E6),  
  42.                 (int) (113.97246 * 1E6));  
  43.         // 创建标记(世界之窗)  
  44.         OverlayItem overlayItem = new OverlayItem(point, "世界之窗",  
  45.                 "位于中国广东省深圳市南山区华侨城的大型文化旅游景区,是深圳最为著名的旅游景点之一。");  
  46.         // 将标记添加到图层中(可添加多个OverlayItem)  
  47.         overlay.addOverlay(overlayItem);  
  48.  
  49.         /**  
  50.          * 创建并添加第二个标记:锦绣中华(经度:22.53108 纬度:113.99151)  
  51.          */  
  52.         point = new GeoPoint((int) (22.53108 * 1E6), (int) (113.99151 * 1E6));  
  53.         // 创建标记(锦绣中华)  
  54.         overlayItem = new OverlayItem(point, "锦绣中华",  
  55. "中国旅游胜地四十佳之一,是目前世界上最大的实景微缩景区,已入选中国世界纪录协会世界最大实景微缩景区候选世界纪录。 ");  
  56.         // 将标记添加到图层中(可添加多个OverlayItem)  
  57.         overlay.addOverlay(overlayItem);  
  58.  
  59.         /**  
  60.          * 往地图上添加自定义的ItemizedOverlay  
  61.          */  
  62.         List<Overlay> mapOverlays = mapView.getOverlays();  
  63.         mapOverlays.add(overlay);  
  64.  
  65.         // 设置地图模式为交通地图  
  66.         mapView.setStreetView(true);  
  67.         // 设置启用内置的缩放控件  
  68.         mapView.setBuiltInZoomControls(true);  
  69.         /**  
  70.          * 取得地图控制器对象,用于控制MapView  
  71.          */  
  72.         // 设置地图的中心  
  73.         mapView.getController().setCenter(point);  
  74.         // 设置地图默认的缩放级别  
  75.         mapView.getController().setZoom(13);  
  76.  
  77.     }  
  78.  
  79.     @Override  
  80.     protected boolean isRouteDisplayed() {  
  81.         // TODO Auto-generated method stub  
  82.         return false;  
  83.     }  
  84.  
  85.     /**  
  86.      * 监听器 当一个Overlay焦点改变时触发  
  87.      */  
  88.     private final ItemizedOverlay.OnFocusChangeListener onFocusChangeListener = new ItemizedOverlay.OnFocusChangeListener() {  
  89.  
  90.         @Override  
  91.         public void onFocusChanged(ItemizedOverlay overlay, OverlayItem newFocus)   
  92. {  
  93.             // 创建气泡窗口  
  94.             if (popView != null) {  
  95.                 popView.setVisibility(View.GONE);  
  96.             }  
  97.             if (newFocus != null) {  
  98.  
  99.                 MapView.LayoutParams geoLP = (MapView.LayoutParams) popView  
  100.                         .getLayoutParams();  
  101.                 geoLP.point = newFocus.getPoint();// 这行用于popView的定位  
  102.                 TextView title = (TextView) popView  
  103.                         .findViewById(R.id.map_bubbleTitle);  
  104.                 title.setText(newFocus.getTitle());  
  105.  
  106.                 TextView desc = (TextView) popView  
  107.                         .findViewById(R.id.map_bubbleText);  
  108.                 if (newFocus.getSnippet() == null  
  109.                         || newFocus.getSnippet().length() == 0) {  
  110.                     desc.setVisibility(View.GONE);  
  111.                 } else {  
  112.                     desc.setVisibility(View.VISIBLE);  
  113.                     desc.setText(newFocus.getSnippet());  
  114.                 }  
  115.                 mapView.updateViewLayout(popView, geoLP);  
  116.                 popView.setVisibility(View.VISIBLE);  
  117.             }  
  118.         }  
  119.     };  
  120.  
  121. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值