首页 » Android程序设计:第2版 » Android程序设计:第2版全文在线阅读

《Android程序设计:第2版》MapView和MyLocationOverlay初始化

关灯直达底部

MicroJobs中的地图包含两种模式:

·在启动时,如果我们在Spinner中选择的是Current Location,则我们希望可以显示当前位置的地图,并跟踪自己的移动记录。在这个地图中,我们使用MyLocationOverlay类。

·当我们在Spinner中选择了特定的位置时,我们希望只显示这个位置的地图,关闭位置更新,不需要跟踪自己的位置。

我们一起来看MicroJobs.java的代码,它对MapView执行初始化,并跟踪定位我们的当前位置:


@Overridepublic void onCreate(Bundle savedInstanceState) {    // code elided...    mvMap = (MapView) findViewById(R.id.mapmain);①    // get the map controller    final MapController mc = mvMap.getController;②    mMyLocationOverlay = new MyLocationOverlay(this, mvMap);③    mMyLocationOverlay.enable MyLocation;      mMyLocationOverlay.runOnFirstFix(④        new Runnable {                @Override            public void run {                mc.animateTo(mMyLocationOverlay.getMyLocation);⑤                mc.setZoom(16);                }            });        Drawable marker = getResources.getDrawable(R.drawable.android_tiny_image);⑥        marker.setBounds(0, 0, marker.getIntrinsicWidth, marker.getIntrinsicHeight);        mvMap.getOverlays.add(new MJJobsOverlay(marker));        mvMap.setClickable(true);⑦        mvMap.setEnabled(true);        mvMap.setSatellite(false);        mvMap.setTraffic(false);        mvMap.setStreetView(false);        // start out with a general zoom        mc.setZoom(16);⑧        // code elided...     }     /* Required method to indicate whether we display routes */    @Override    protected boolean isRouteDisplayed { return false; }⑨  

以下是一些重点代码的解释:

① 首先,在main.xml布局文件中的MapView和其他视图的查找方式完全相同,它被赋给变量mvMap,其类型是MapView,需要的时候可以使用这个变量。

② 在MapController上获取和MapView关联的handle。这里将使用这个handle来(动态)拖放地图,执行缩小、放大等操作。

③ 为了使用MyLocationOverlay,这里创建了一个新的实例mMyLocationOverlay。

④ 在mMyLocationOverlay实例中,做的第一件事情是定义了一个方法,当从位置供应商处接收到第一个位置修复时,Android会调用该方法。

⑤ 这个runOnFirstFix方法把地图移动到当前位置(通过mMyLocationOverlay.getMyLocation获取)并放大到合理尺寸使我们能够看到其附近的工作信息。

⑥ 下一步,在mMyLocationOverlay中标识出可用的工作信息。这里使用了保存在res/drawable目录下的图像android_tiny_image。该图像是一个小小的Android机器人。还定义了Drawable的边界,并把标记覆盖图添加到MapView mvMap的列表中。

⑦ 下面,将为myMap设置一些初始属性,这些属性随后就会介绍。这里将允许用户通过菜单按钮更改大多数属性。

⑧ 然后,为了避免地理位置提供商触发runOnFirstFix,会重新设置缩放级别。

⑨ 最后,MapView要求我们覆盖isRouteDisplayed方法,以表示我们是否在地图上显示路由信息。因为在这个例子中没有显示路由信息,所以返回false。

MyLocationOverlay封装了很多地理位置和地图编码。在调用构造函数时,需要执行下述操作:

·让Android识别出环境中有哪些可用的地理位置provider(GPS、Cell ID和三角区等)。

·连接到这些地理位置提供者。

·随着手机移动,让地理位置提供者周期性地更新地理位置信息。

·连接到路由中,它会根据需要自动移动地图来追踪地理位置任何变化。

MyLocationOverlay还支持在MapView上放置一个指南针,并更新该指南针。但是在MJAndroid中不会使用该指南针。

在代码中设置的地图属性如下:

setClickable

我们希望用户按下job选项卡,MJAndroid可以显示关于该job的更多信息,因此把该属性设置成true。

setEnabled

该方法实际上是从android.view.View中继承来的。Google没有明确地说明该参数在MapView中的含义,但是猜想它应该是启用地图的标准功能——放大、缩小、拖曳等。

setSatellite

设置该标记会在组合地图中增加卫星视图,但是清除该标记会删除该视图。刚开始,我们希望不要显示卫星地图。

setTraffic

同样,设置或清除该标记会在地图上增加或删除当前的交通信息。同样,我们也希望刚开始不要显示交通信息。

setStreetView

我们现在也不想要街道视图,虽然在后面将会支持用户启用这个视图。

Android地图的缩放功能

Android地图支持缩小和放大。“i”键对地图进行缩小,而“o”键对地图放大。程序可以通过MapController控制地图缩小和放大。

关于缩小和放大,定义了一些方法,它们都依赖于MapController。Android为地图定义了21级的缩放级别。在缩放级别1,地球赤道长是256个像素。每增加一个缩放级别,显示的像素数就是原来的两倍。Google提示不支持更高级别的高清地图显示。所有超出限制的级别缩放方法还是会回到级别1~21。

控制缩放的方法及其参数如下:

zoomIn

缩小1个级别

zoomOut

放大1个级别

setZoom(int zoomlevel)

缩放到给定级别,级别的取值范围是1~21

zoomInFixing(int xpixel,int ypixel),zoomOutFixing(int xpixel,int ypixel)

缩小一个级别,并保持屏幕上某个位置固定。通常情况下,当执行缩小和放大时,默认情况下屏幕中心是唯一固定点。该函数支持在地图上以任何点为固定点。

zoomToSpan(int latSpanE6,int longSpanE6)

为了在地图上支持拖曳而执行的缩放。其真正执行的是选择的缩放级别,从而和请求的拖曳匹配最佳。维度和经度拖曳参数表示成实际值的10 6倍。例如,维度/经度拖曳2.5×1.0,则在该函数中将表示成zoomToSpan(2500000,1000000)。