在开发地图的应用中,我们很多时候需要在地图上绘制一些文本,图标信息(比如当前位置的图标,比如某个区域内肯德基店的所有兴趣点)

为了能够在地图上绘制我们需要的信息(比如图片),我们需要知道图层的概念。(就像photoshop里的图层)

接下来我们需要利用API接口实现我们的功能(我们这里采用的是高德的API,高德API开发包可自行在官网上下载)

高德API提供了一个基类Overlay,用于在地图上绘图。我们可以继承自该类,重写draw()方法,调用canvas(画布)的一些方法(比如drawText,drawCircle,drawBitmap),可以在地图上画出许多图形来。这些东西在上一章中有过介绍就不在啰嗦了。

API里还有一个抽象类,它叫做ItemizedOverlay<OverlayItem>,它继承自Overlay,所以它也是一个图层类。该类最大的特点是,它可以描绘出一组兴趣点(POI)出来。继承该抽象类,必须复写三个方法,首先是一个构造方法,它含有一个参数Drawable,该参数是一个图形资源,实则上就是负责显示在地图上的一个图标。另外两个方法分别是

     @Overrideprotected OverlayItem createItem(int i) {}@Overridepublic int size() {}

方法createItem中的返回类型是OverlayItem,该类封装有地理点(GeoPoint),片段信息(Snippet)以及标题(Title),我们通常是这样来得到一个OverlayItem对象的:

OverlayItem item = new OverlayItem(gp, "title","snippet");//gp的类型是GeoPoint

在讲第二个方法前,我们首先看看如何继承ItemizedOverlay<OverlayItem>,假设实现类名为DemoItemizedOverlay

在自己的实现类中,对于字段,我们需要添加一个List<OverlayItem>列表:

List<OverlayItem> overlay_list = new ArrayList<OverlayItem>();

注意该列表的元素类型是OverlayItem。

接下来是重写构造方法:

     public DemoItemizedOverlay(Drawable d) {super(boundCenterBottom(d));}

方法boundCenterBottom的作用是为了将(0,0)点置于图标的底边中点。

而方法boundCenter的作用是将(0,0)置于图标中央。

然后是重写两个必写方法:

     @Overrideprotected OverlayItem createItem(int i) {return over_list.get(i);}@Overridepublic int size() {return over_list.size();}

如果想在图标附近添加文本,我们需要复写draw方法:

     @Overridepublic void draw(Canvas canvas, MapView mapView, boolean shadow) {for(int i=0; i< size(); i++) {OverlayItem item = createItem(i);GeoPoint gp = item.getPoint();Point mPoint = new Point();Projection proj = mapView.getProjection();proj.toPixels(gp, mPoint);Paint mPaint = new Paint();mPaint.setColor(Color.BLUE);mPaint.setAntiAlias(true);    //抗锯齿canvas.drawText("图标" + (i+1), mPoint.x, mPoint.y-30, mPaint);}super.draw(canvas, mapView, shadow);}

注意到列表内容是空的,我们需要增加方法来向列表添加内容和删除内容

     /*** 添加一个Overlay*/public void addOverlay(OverlayItem overlay) {over_list.add(overlay);populate();}/*** 删除一个Overlay*/public void dropOverlay(OverlayItem item) {if(over_list.contains(item)) {over_list.remove(item);populate();}}

关键点来了,有没有注意到populate()方法,我们可以看看该方法的定义位置:

         void com.amap.mapapi.map.ItemizedOverlay.populate()

说明该方法是ItemizedOverlay类里的。

我们看看官方文档是怎么描述该方法的。

在一个新的ItemizedOverlay对象上执行所有操作的工具方法。子类通过createItem(int)方法提供item。一旦有了数据,子类在调用其它方法前,首先调用该方法。

我们在回过头来看看那两个必写方法,createItem()和size()方法。

当我们在向列表里添加或者删除(各种操作)方法后,必须首先调用populate()方法。调用populate()方法后,接下来就会自动调用createItem()方法和size()方法,这样列表里才真正有了数据。为了验证这一点,我自己做了一个测试。

测试大概是这样的, 我首先创建了DemoItemizedOverlay对象,然后创建了4个OverlayItem对象,接着调用方法addOverlay把它们加入到列表中。如果addOverlay方法里含有populate()方法,那么在测试地图上,我们可以看到有4个图标以及文本信息。然后如果我把populate()方法删掉,此时会抛出异常终止信息,查看LogCat日志:

之所以会抛出空指针异常,是因为没有调用populate()方法,所以也不会调用createItem()方法,因此虽然调用了addOverlay方法,但是实际上并没有往列表里添加Overlay,因此会抛出NullPointerException。

我们看下createItem方法的描述:

createItemprotected abstract Item createItem(int i)
子类通过该方法创建实体item。该item只能从populate()开始调用,并且缓存起来待以后使用。
参数:
i - 实体item对象。
返回:
创建的实体item。

下面是测试的MainActivity代码:

package com.example.itemizedoverlaytest;import java.util.ArrayList;
import java.util.List;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.Toast;import com.amap.mapapi.core.GeoPoint;
import com.amap.mapapi.core.OverlayItem;
import com.amap.mapapi.map.ItemizedOverlay;
import com.amap.mapapi.map.MapActivity;
import com.amap.mapapi.map.MapController;
import com.amap.mapapi.map.MapView;
import com.amap.mapapi.map.Overlay;
import com.amap.mapapi.map.Projection;public class MainActivity extends MapActivity {private MapView mapView;private Drawable d;private MapController controller;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//this.setMapMode(MAP_MODE_VECTOR);  //设置为矢量图ssetContentView(R.layout.activity_main);mapView = (MapView)findViewById(R.id.mapView);mapView.setBuiltInZoomControls(true);    //开启缩放控件controller = mapView.getController();  //得到控制对象//      mapView.setSatellite(true);             //设置卫星模式GeoPoint gp = new GeoPoint((int) (30.227123 * 1E6),(int) (120.040687 * 1E6));  //工大controller.setCenter(gp);controller.setZoom(10);d = getResources().getDrawable(R.drawable.marker_gpsvalid);//  d.setBounds(0, 0, right, bottom)List<Overlay> map_list = mapView.getOverlays();DemoItemizedOverlay demo = new DemoItemizedOverlay(d, this);GeoPoint gp1 = new GeoPoint((int) (30.227123 * 1E6),(int) (120.040687 * 1E6));OverlayItem item1 = new OverlayItem(gp1, "title1","snippet1");demo.addOverlay(item1);GeoPoint gp2 = new GeoPoint((int) (30.237123 * 1E6),(int) (120.050687 * 1E6));OverlayItem item2 = new OverlayItem(gp2, "title2","snippet2");demo.addOverlay(item2);   GeoPoint gp3 = new GeoPoint((int) (30.247123 * 1E6),(int) (120.060687 * 1E6));OverlayItem item3 = new OverlayItem(gp3, "title3","snippet3");demo.addOverlay(item3);   map_list.add(demo);GeoPoint gp4 = new GeoPoint((int) (30.257123 * 1E6),(int) (120.070687 * 1E6));OverlayItem item4 = new OverlayItem(gp4, "title4","snippet4");demo.addOverlay(item4);    demo.dropOverlay(item2);}public class DemoItemizedOverlay extends ItemizedOverlay<OverlayItem> {private List<OverlayItem> over_list = new ArrayList<OverlayItem>();private Context mContext;             //上下文public DemoItemizedOverlay(Drawable d) {super(boundCenterBottom(d));}public DemoItemizedOverlay(Drawable d,Context c) {this(d);mContext = c;}@Overridepublic void draw(Canvas canvas, MapView mapView, boolean shadow) {for(int i=0; i< size(); i++) {OverlayItem item = createItem(i);GeoPoint gp = item.getPoint();Point mPoint = new Point();Projection proj = mapView.getProjection();proj.toPixels(gp, mPoint);Paint mPaint = new Paint();mPaint.setColor(Color.BLUE);mPaint.setAntiAlias(true); //抗锯齿canvas.drawText("图标" + (i+1), mPoint.x, mPoint.y-30, mPaint);}super.draw(canvas, mapView, shadow);}@Overrideprotected boolean onTap(int i) {OverlayItem item = over_list.get(i);Toast.makeText(mContext,"片段信息:" + item.getSnippet() + "\n标题:" + item.getTitle(),Toast.LENGTH_SHORT).show();return super.onTap(i);}@Overrideprotected OverlayItem createItem(int i) {return over_list.get(i);}@Overridepublic int size() {return over_list.size();}/*** 添加一个Overlay*/public void addOverlay(OverlayItem overlay) {over_list.add(overlay);populate();}/*** 删除一个Overlay*/public void dropOverlay(OverlayItem item) {if(over_list.contains(item)) {over_list.remove(item);populate();}}}
}

最后别忘了加相应的 权限,以及在安卓清单文件中 注册该Activity。

需要项目资源的可点击:http://download.csdn.net/detail/czjuttsw/4726692

お疲れ様でした!^_^

Over...

对populate()方法的理解相关推荐

  1. 【转】五、谈扩展方法的理解

    [转]五.谈扩展方法的理解 为什么要用扩展方法 在说什么是扩展方法之前我们先来说说为什么要用扩展方法. 首先我们定义一个 Person 类: public class Person {/// < ...

  2. python threading模块的方法_Python THREADING模块中的JOIN()方法深入理解

    看了oschina上的两个代码,受益匪浅.其中对join()方法不理解,看python官网文档的介绍: join([timeout]):等待直到进程结束.这将阻塞正在调用的线程,直到被调用join() ...

  3. sklearn中GBDT的一些参数、属性、方法的理解

    文章目录 GBDT 分类器 引入 重要参数 loss learning_rate subsample n_estimators criterion max_depth min_samples_leaf ...

  4. 频域分析方法的理解(信号、频谱、能量谱、功率谱、倒频谱、小波分析)(终极教程)

    信号频域分析方法的理解(频谱.能量谱.功率谱.倒频谱.小波分析) 参考文献,值得一读 https://blog.csdn.net/fengzhuqiaoqiu/article/details/1011 ...

  5. hashCode()、equals()以及compareTo()方法的理解

    原文出自:http://blog.sina.com.cn/s/blog_50d936c40100nvzz.html hashCode().equals()以及compareTo()方法的理解 转载▼ ...

  6. [react] 请说说你对react的render方法的理解

    [react] 请说说你对react的render方法的理解 render是class组件中必须被重载的方法,组件执行render方法的条件如下: 初始渲染 this.setState方法,参数不能为 ...

  7. [css] 请描述下你对translate()方法的理解

    [css] 请描述下你对translate()方法的理解 Single length/percentage value一个长度值或百分比表示X轴和Y轴使用一样的值进行二维上的平移.等同于transla ...

  8. C#回调函数应用示例,形象比喻方法助理解

    C#回调函数应用示例,形象比喻方法助理解,整理了一个简单的例子来说明回调函数的用法: namespace CallBackFunction {     class Program     {      ...

  9. 案例:演示使用beantuils的setProperty()、getProperty()和populate()方法访问JavaBean的属性

    一.添加jar包并发布到类路径 二.创建Person类 public class Person {private String name;private int age;public String g ...

最新文章

  1. android从放弃到精通第10天 勿忘初心
  2. 机器学习实战-贝叶斯算法-24
  3. Sybase时间日期函数
  4. php访问服务器文件路径,PHP与服务器文件系统的简单交互
  5. java dumpheap_java程序性能分析之thread dump和heap dump
  6. SpringBoot应用监控——Actuator安全隐患及解决方案
  7. Hadoop环境的配置搭建和基本概念
  8. 【Arduino基础教程】PM2.5粉尘检测传感器
  9. Ubuntu 14.04 下每次重启系统都默认最大亮度的解决办法
  10. java.util.current_Java基础知识-java.util.concurrent包下常见类的使用
  11. 2018年的43个最佳网络监控工具
  12. Java抓图程序的实现(改进版)
  13. d3dx9_43.dll如何修复?计算机中丢失d3dx9_43.dll的解决办法
  14. 关于华三HCL使用时,设备端口状态为down的解决
  15. 正面管教读书笔记 08 班会
  16. 使用Goods类创建十个商品 第四章 面向对象(上)课堂作业2
  17. 几个常用术语名词解释nbsp;MSISDN,MSRN…
  18. python geany是什么_Geany中怎么配置python?
  19. 普罗米修斯 mysql监控_普罗米修斯Prometheus监控MySQL
  20. 基于ssh远程操作虚拟机(Linux系统)

热门文章

  1. mysql数据封装是什么_MySql数据封装操作类
  2. 完美解决:调用sklearn出现诸如ImportError: cannot import name ‘LogisticR‘ from ‘sklearn.linear_model‘ (D:\Progr
  3. 【随记】无线网络能替代有线网络吗?
  4. 微信,世界上最成功的私链
  5. python pip安装pymssql_pip安装pymssql模块时报错“PEP 517”怎样处理
  6. BUCTOJ 3322 QQ号与质数
  7. 西游记中与孙悟空称过兄弟的人
  8. 送女朋友实用的七夕礼物、送女朋友七夕礼物最有意义排行榜
  9. DIV滚动条自动滚动到最底部的两种方法
  10. 带你认识世界最值钱的十种货币