博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Map对象
阅读量:6258 次
发布时间:2019-06-22

本文共 7236 字,大约阅读时间需要 24 分钟。

在API中,地图由类来表示。

Map对象

Google Maps Android API允许你在你的Android应用程序中显示一个Google地图。这些地图有着与你在Google Maps for Mobile (GMM) app中所看到的相同的外观,并且API暴露了许多相同的功能。在GMM应用程序和由Google Maps Android API所显示的Maps之间两个值得注意的不同之处为:

  • 由API所显示的Map tiles不包含任何个性化的内容,比如个性化的智能图标。
  • 不是地图上所有的图标都是可点击的。比如,经纬仪站图标就不能被点击。然而,你为地图添加的标记是可点击的,并且,API具有一个listener回调接口,用于各种标记的交互。

除了地图功能,API也支持与Android UI模型一致的全域的交互。比如,你可以通过定义对用户手势作出相应的listener,来设置与一幅地图的交互。

使用一个Map对象的关键的类为类。GoogleMap在你的应用程序内建模了地图对象。在你的UI内,一个地图将由一个MapFragmentMapView对象来表示。

自动地处理如下的操作:

  • 连接Google Maps服务。
  • 下载地图tiles。
  • 在设备屏幕上显示tiles。
  • 显示各种控制装置,比如pan和放缩
  • 通过移动地图和放大或缩小来对pan和放缩手势作出反应。

除了这些自动的操作,你也可以通过API的对象和方法控制地图的行为。比如,具有回调方法,来对地图上的击键和触摸手势作出反应。你也可以在你的地图上设置标记图标和给他添加overlays,使用你提供给的对象。

MapFragment

,一个Android 类的子类,使你可以在一个Android Fragment中放置一个地图。MapFragment对象的行为就像地图的容器,它还提供了对于GoogleMap对象进行访问的方法。

不像一个View,一个Fragment表示一个Activity中的一种行为或用户接口的一部分。你可以在一个单独的activity中结合多个fragments,来创建一个multi-pane UI,并在多个activities中复用一个fragment。参考关于的Android文档来学习更多的东西。

注意:Google Maps Android API需要API level 12或更高来支持MapFragment对象。如果你应用程序targeting版本比API level 12早,则你可以通过SupportMapFragment类来访问相同的功能。但你将不得不再包含Android 

MapView

,是Android 类的一个子类,允许你在一个Android View中放置一个地图。一个View表示屏幕的一个矩形区域,并且是android应用程序和widgets的一个基本的构造块。与一个MapFragment很类似,MapView的行为就像地图的容器,通过GoogleMap对象将核心的地图功能暴露出来。

这个类的用户必须forward所有的Activity生命周期方法 - 比如onCreate(),onDestroy(),onResume()和onPause() - 到MapView类中对应的方法。

地图类型

Google Maps Android API中有很多的地图类型可用。一个地图的类型管理着该地图总体的代表。比如,一个地图集通常包含政治地图,而集中于显示地区,而道路地图则为某个城市或地区显示所有的道路。

Google Maps Android API提供了四种地图的类型,及没有任何地图的一种选项

标准

典型的道路地图。会显示道路,一些人造的功能设施,及重要的自然特征,比如河流。道路和特征标签也是可见的。

混杂

卫星照片数据,同时伴有道路地图。道路和功能标签也是可见的。

卫星

卫星照片数据。道路和功能标签也是不可见的。

地形

地形的数据。这种地图包含色彩,轮廓线和标签,及透视阴影。一些道路和标签也是可见的。

没有tiles。这种地图将渲染一个空的网格,而没有加载tiles。

修改地图类型

为了设置一个地图的类型,调用对象的方法,传递给它定义在中的类型常量中的一个。比如,要显示一个卫星地图:

GoogleMap map;...// Sets the map type to be "hybrid"map.setMapType(GoogleMap.MAP_TYPE_HYBRID);

下面的图像显示了相同位置标准,混杂和地形地图的对比:

MapType Comparison

室内地图

在比较高的放缩级别上,地图将会为室内空间显示平面图,比如机场,购物中心,大型的零售商店,和中转站。室内平面图在‘标准’地图类型(GoogleMap.MAP_TYPE_NORMAL)下才会显示,并且会在用户放缩大时自动启用,而在地图被缩小时自动消失。

平面图会在某个时刻显示在一个地图上。默认地,这是添加到你的app的第一幅地图。如果你想要在一幅不同的地图上显示平面图,则首先通过调用GoogleMaps.setIndoorEnabled(false)来禁用你第一幅地图上的室内地图,然后在第二幅地图上调用setIndoorEnabled(true)。

添加平面图

平面图在中可用。如果某个你想要在你的应用中突出的建筑,其平面图数据不可用,则你可以:

  • 直接为Google Maps。这将使你的平面图对于Google Maps的所有用户都是可用的。
  • 以一个的方式来显示一个平面图。这使得只有你的应用程序的用户可以查看你的平面图。

给一个Android应用程序添加一幅地图

添加一幅地图的基本步骤是:

  1. (一次性的) 按照里的步骤来得到API,获取一个key,并给你的Android Manifest添加所需的属性。
  2. 给将要处理地图的添加一个对象。完成这一步最简单的方法就是给的布局文件添加一个<fragment>元素。
  3. 在Activity对象的方法中,获取一个指向对象的句柄。对象是地图本身的内部表示;要为一幅地图设置视图选项,则修改它的对象
  4. 最后,确认地图已经被正确加载了。

你遵循这些步骤,即可为对象设置初始的选项。方法完成之后自动地显示地图。

添加一个Fragment

给你的Activity的布局文件添加一个<fragment>元素来定义一个对象。在这个元素中,设置android:name属性为"com.google.android.gms.maps.MapFragment"。这将自动地给Activity附加一个

下面的布局文件包含一个<fragment>元素:

你也可以在代码中给一个添加一个。为了做到这一点,创建一个新的MapFragment实例,然后调用将这个添加到当前的

mMapFragment = MapFragment.newInstance(); FragmentTransaction fragmentTransaction =         getFragmentManager().beginTransaction(); fragmentTransaction.add(R.id.my_container, mMapFragment); fragmentTransaction.commit();

添加地图代码

为了在你的代码里使用地图,首先设置布局文件为的content view。比如,如果布局文件的名字为main.xml,则使用这样的代码:

public void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main);    ...}

接下来,通过调用来获得一个指向地图的句柄,传递给它你在前面步骤中添加的元素的资源ID。将返回值强制转换为一个 

private GoogleMap mMap;...mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();

Notice that the resource ID R.id.map is added automatically to the Android project when you build the layout file.

注意,资源ID R.id.map是在你编译布局文件时自动被添加到Android工程的。

通过指向的对象的句柄,你可以为地图设置初始选项。

验证地图的可访问性

在你能够与一个GoogleMap对象交互之前,你将需要确认一个对象可以被初始化。你可以通过调用MapFragment.getMap()或MapView.getMap()方法,并检查它们返回的对象不为null,来验证GoogleMap是可以访问的。

下面显示了一个测试的例子来确认一个GoogleMap的可访问性。这个方法可以从onCreate()和onResume()阶段来调用,以确保地图总是可用的。

private void setUpMapIfNeeded() {    // Do a null check to confirm that we have not already instantiated the map.    if (mMap == null) {        mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map))                            .getMap();        // Check if we were successful in obtaining the map.        if (mMap != null) {            // The Map is verified. It is now safe to manipulate the map.        }    }}

配置初始状态

Maps API允许你配置地图的初始状态以适应你的应用的需要。你可以指定如下的这些:

  • 照相机方位,包括:位置,缩放比,方位,和倾斜。参考以获取关于照相机方位更多的细节。
  • 地图类型。
  • 放缩按钮和/或罗盘是否出现在屏幕上。
  • 用户可以使用那个手势来管理照相机。

你可以配置地图的初始状态,通过XML,如果你已经给你的Activity布局文件添加了地图,或编程的方式,如果你用那样的方式来添加地图。

使用XML属性

这个小节将描述,如果你使用一个XML布局文件来给你的应用添加一幅地图,要如何设置地图的初始状态。

Maps API为MapFragment或MapView定义了一系列的,你可以直接使用它们在布局文件中配置地图的初始状态。当前定义了下面这些属性:

  • mapType。 这个允许你指定所显示的地图的类型。有效的值包括:none,normal,hybrid,satellite和terrain。
  • cameraTargetLat,cameraTargetLng,cameraZoom,cameraBearing,cameraTilt。这些允许你指定初始的照相机方位。参考来获取关于照相机方位和它的属性更多的细节。
  • uiZoomControls,uiCompass。这些允许你指定你是否想要放缩控制和罗盘显示在地图上。参考以获取更多细节。
  • uiZoomGestures,uiScrollGestures,uiRotateGestures,uiTiltGestures。这些允许你指定与地图交互的哪些手势是被启用/禁用的。参考以获取更多细节。
  • zOrderOnTop。控制是否将地图视图的surface放置在它的窗口的顶部。参考获取更多细节。注意,这将覆盖所有可能出现在地图上的其他的视图(比如,放缩控制,我的位置按钮)。
  • useViewLifecycle。只有在使用MapFragment时有效。这个属性指定了地图的生命周期是否应该与fragment的视图或者fragment本身绑定。参考来获取更多细节。

为了在你的XML布局文件内使用这些定制属性,你必须首先添加如下的命名空间声明(你可以选择任何命名空间,它不一定是map):

xmlns:map="http://schemas.android.com/apk/res-auto"

然后你可以添加以一个map: 为前缀的属性到你的布局组件里,就像你使用的那些标准的Android属性一样。

下面的XML代码片段显示了如何通过一些定制选项配置一个MapFragment(相同的属性也可以应用于一个MapView):

以编程方式

这个小节描述,如果你用编程的方式给你的应用添加了一个地图,要如何设置地图的初始状态。

如果你用编程的方式添加了一个MapFragment (或MapView),则你可以通过传递一个指定了你的选项的对象来配置它的初始状态。可用的属性与通过XML可用的那些完全一样。你可以像下面这样创建一个GoogleMapOptions对象:

GoogleMapOptions options = new GoogleMapOptions();
然后像下面这样配置它:
options.mapType(GoogleMap.MAP_TYPE_SATELLITE)    .compassEnabled(false)    .rotateGesturesEnabled(false)    .tiltGesturesEnabled(false);

为了在你创建一幅地图时应用这些选项,执行下面中的一个:

  • 如果你在使用一个MapFragment,使用 静态工厂方法来构造fragment并传递你的定制配置选项。
  • 如果你在使用一个MapView,则使用 构造器并给它传递你的定制配置项。

地图padding

一个Google Map设计来填充由它的容器元素所定义的整个区域,典型的是一个MapView或MapFragment。地图如何呈现和运转的一些方面则由它的容器的dimensions来定义:

  • 照相机的目标将反映填充的区域的中心。
  • 是相对于地图的边缘来定位的。
  • 法律信息,比如版权声明,或Google log出现在地图的底部边缘

你可以使用GoogleMap.方法,来在地图的四周边缘添加填充。该地图将继续填充整个容器,但文本和控制定位,地图手势,和照相机移动将像是它已经被放进了一个稍小一点的空间一样运转。这将导致下面的变化:

  • Camera movements via API calls or button presses (e.g., compass, my location, zoom buttons) will be relative to the padded region.
  • getCameraPosition() will return the center of the padded region.
  • Projection.getVisibleRegion() will return the padded region.
  • UI controls will be offset from the edge of the container by the specified number of pixels.

Padding can be helpful when designing UIs that overlap some portion of the map. For example, in the below image, the map is padded along the top and right edges. Visible map controls and legal text will be displayed along the edges of the padded region, shown in green, while the map will continue to fill the entire container, shown in blue. In this example, you could float a menu over the right side of the map without obscuring map controls.

Map Padding 

Note:  As per the , your application must not remove or obscure the Google logo or copyright notices. Map Padding allows you to reposition these elements if necessary. If you display a custom UI at the bottom of the map, add padding to the bottom of the map so that the logo and legal notices will always be visible.

Done.

转载于:https://my.oschina.net/wolfcs/blog/180537

你可能感兴趣的文章
sed awk 笔记(二)
查看>>
DOCKER 给运行中的容器添加映射端口
查看>>
linux |版权许可GNU和GPL
查看>>
System Center 2012 SP1 之四 配置App Controller
查看>>
第三篇 Python函数(day3)
查看>>
如何轻松快速搭建商城系统?
查看>>
Ansible问题汇总
查看>>
Hover States - 有趣的用户界面及交互设计
查看>>
C# IO流的操作
查看>>
SVN的安装与常用功能使用以及解决安装配置过程中的一些错误
查看>>
EasyUI numbox输入框,金额格式化显示
查看>>
Lync 2013前端池添加服务器报无法更新数据库RTC,因为需要执行版本从0到125的主要升级...
查看>>
JAVA并发处理经验(四)并行模式与算法6:NIO网络编程
查看>>
数组中的push()和pop()方法
查看>>
c3p0-0.9.2.1数据连接池连接报错问题
查看>>
maillog报错Warning: Inotify instance limit
查看>>
系统ID表
查看>>
apk反编译步骤
查看>>
自己做的笔试题
查看>>
SCVMM Self-Service Portal 2.0 SP1安装体验
查看>>