Hello,Views(三)GoogleMap地图使用下篇(附源码)

前言

本文是官方教程的中文翻译,讲的是Google地图的使用,续接上篇。(下载源码

 

第二部分:添加Overlay Items

 

现在,你已经有了一张地图,但是在许多情况下,你需要创建自己的地图标记和图层。那么接下来我们就来完善这个功能。要达到我们的目的,我们要继承ItemizedOverlay 类,它可以提供给我们所需的 Overlay集合(Overlay是覆盖的意思,本人觉得可以翻译为“图层”)。

 

1.窗建一个java类命名为HelloItemizedOverlay 并且继承ItemizedOverlay类,为了便于观察和结构的清晰,此处,我新建了一个java文件,把该类放到到里面。

 

2.为该类声明成员变量,首先是一个OverlayItem ArrayList,我们的图层元素就是放到这里面的。

private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();

3.现在重写构造器,调父类构造器传入Drawable 参数时,先用boundCenterBottom()方法绑定一下,如果没有把图片绑定的话,是没有效果的,也就是不能在地图上正确显示该涂层。

public HelloItemizedOverlay(Drawable defaultMarker) 
{
super(boundCenterBottom(defaultMarker));
}

4.In orde如果要把图层添加到集合中还要定义addOverlay()方法:

public void addOverlay(OverlayItem overlay) 
{
mOverlays.add(overlay);
populate();
}

需要提醒的是,每次执行该函数的时候,最后都要调用populate() 方法,这个方法会读取集合中的每一个元素,为绘制到屏幕做准备。

 

5.当执行了populate()方法时,它会调用createItem(int)方法来正式创建每个 图层元素:

@Override
protected OverlayItem createItem(int i)
{
return mOverlays.get(i);
}

6.同样重写size() ,返回当前集合中图层元素个数:

@Override
public int size()
{
return mOverlays.size();
}

7.我们再写一个构造器,这个很关键,这一步的话,原教程貌似是有问题的,本人经实践发现此处也应该在调父类构造器时将Drawable参数用boundCenterBottom绑定,另外就是获得上下文的引用:

public HelloItemizedOverlay(Drawable defaultMarker, Context context) 
{
super(boundCenterBottom(defaultMarker));
mContext = context;
}

8.现在T重写onTap()回调方法,他负责处理用户点击图层元素的事件:

复制代码
@Override
protected boolean onTap(int index)
{
OverlayItem item = mOverlays.get(index);
AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());
dialog.show();
return true;
}
复制代码

从代码中可以看出,它的效果就是,当单击地图上我们添加的图标时,弹出一个对话框,告诉我们你单击的对象的相关信息。

至此,我们已经完成对HelloItemizedOverlay 的编写,可以回到HelloGoogleMaps 去调用他了。

9.首先需要一张用于图层显示的图片,把它放在项目的res/drawable/文件夹下面

10.在OnCreate()方法末尾继续添加代码:

List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable);

11.所有的图层元素在地图里面都由MapView来承载,因此如果你想添加一些图层元素,那么就要通过 getOverlays()来获得一个list列表,然后为他们指定图片,这些在HelloItemizedOverlay 中我们已经处理好了。

 

12.现在创建一个地理位置的坐标点 GeoPoin,用于指定第一个图层元素的摆放位置,然后把它传给新的OverlayItem:

GeoPoint point = new GeoPoint(19240000,-99120000);
OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!");

GeoPoint 的参数使用微度为单位(degrees * 1e6). OverlayItem 的构造器接受的参数有GeoPoint 坐标,标题,内容摘要。

 

13.最后我们就可以把OverlayItem 添加到HelloItemizedOverlay 实例中的集合了,再把实例添加到地图:

itemizedoverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedoverlay);

14.运行程序,正常的话可以看到如下效果:

当你单击图标时,会弹出对话框。(下载源码

posted @   小文字  阅读(2190)  评论(3编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示