一切就绪!

着手开发前,请先阅读我们的开发者文档

激活 Google Maps Android API

为帮助您起步,我们将引导您在 Google Developers Console 中先完成几项任务:

  1. 创建或选择项目
  2. 激活 Google Maps Android API
  3. 创建相应密钥
继续

标记

标记指示地图上的单个位置。 您可以通过更改默认颜色,或用自定义图像替换标记图标来定制标记。信息窗口可为标记提供额外背景信息。

简介

标记用于标识地图上的位置。 默认标记使用与 Google Maps 外观一致的标准图标。 可以通过 API 更改图标的颜色、图像或锚点。 标记是 Marker 类型的对象,通过 GoogleMap.addMarker(markerOptions) 方法向地图添加。

标记设计为具有交互能力。 它们默认接收 click 事件,通常与事件侦听器联用以调出信息窗口。将标记的 draggable 属性设置为 true 将允许用户更改标记的位置。可通过长按激活移动标记的功能。

默认情况下,当用户点按标记时,地图工具栏出现在地图右下角,让用户可以快速访问 Google 地图移动应用。您可以禁用该工具栏。 如需了解详细信息,请参阅控件指南

标记入门指南

本集 Maps Live 介绍利用 Google Maps Android API 向地图添加标记的基础知识。

添加标记

以下示例展示如何向地图添加标记。 标记在 10,10 坐标处创建,被点击时会在一个信息窗口内显示字符串“Hello world”。

@Override
public void onMapReady(GoogleMap map) {
    map.addMarker(new MarkerOptions()
        .position(new LatLng(10, 10))
        .title("Hello world"));
}

使标记可拖动

只要标记的 draggable 属性设置为 true,您就可以在将其添加到地图中后对其进行位置调整。长按标记可启用拖动。当您的手指离开屏幕后,标记将保持在该位置。

标记在默认情况下无法拖动。 您必须通过在向地图添加标记前使用 MarkerOptions.draggable(boolean),或者在向地图添加标记后使用 Marker.setDraggable(boolean),显式地将标记设置为可拖动。您可以按标记拖动事件中所述侦听标记上的拖动事件。

以下这段代码用于在澳大利亚珀斯添加一个可拖动标记。

static final LatLng PERTH = new LatLng(-31.90, 115.86);
Marker perth = mMap.addMarker(new MarkerOptions()
                          .position(PERTH)
                          .draggable(true));

定制标记

这段视频介绍了利用标记将地图上的位置可视化的方法。

标记可定义在默认图标位置显示的自定义图像。 定义图标涉及设置若干会影响标记视觉行为的属性。

标记支持通过下列属性进行定制:

Position(必需)
代表标记在地图上位置的 LatLng 值。 这是 Marker 对象唯一的必需属性。
Anchor
图像上将置于标记 LatLng 位置的点。 其默认值为图像底部的中间。
Alpha
设置标记的不透明度。 默认值为 1.0。
Title
当用户点按标记时显示在信息窗口内的字符串。
Snippet
显示在标题下方的附加文本。
Icon
在默认标记图像位置显示的位图。
Draggable
如果您想允许用户移动标记,请将其设置为 true。 默认值为 false
Visible
设置为 false 可让标记不可见。 默认为 true
Flat 或 Billboard 朝向
默认情况下,标记朝向屏幕的相反方向,并且不会随摄像头旋转或倾斜。 Flat 标记朝向地球表面的相反方向,将会随摄像头旋转或倾斜。 两种类型的标记都不会随缩放比例而改变大小。 如果您想要获得这种效果,请使用 GroundOverlays。
Rotation
标记的朝向,以顺时针度数表示。 当标记为 Flat 标记时,默认位置会发生变化。 Flat 标记的默认位置为正北。 如果标记不是 Flat 标记,则默认位置为朝上,并且旋转角度会使标记始终面向摄像头。

下面这段代码可创建一个使用默认图标的简单标记。

static final LatLng MELBOURNE = new LatLng(-37.813, 144.962);
Marker melbourne = mMap.addMarker(new MarkerOptions()
                          .position(MELBOURNE));

定制标记颜色

可通过向 icon() 方法传递 BitmapDescriptor 对象定制默认标记图像的颜色。 您可以使用 BitmapDescriptorFactory 对象中的一组预定义颜色,或者通过 BitmapDescriptorFactory.defaultMarker(float hue) 方法设置自定义标记颜色。色调是一个介于 0 和 360 之间的值,表示色轮上的点。

static final LatLng MELBOURNE = new LatLng(-37.813, 144.962);
Marker melbourne = mMap.addMarker(new MarkerOptions()
                          .position(MELBOURNE)
                          .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));

定制标记不透明度

您可以通过 MarkerOptions.alpha() 方法控制标记的不透明度。 Alpha 应指定为 0.0 和 1.0 之间的浮点值,其中 0 为全透明,1 为全不透明。

static final LatLng MELBOURNE = new LatLng(-37.813, 144.962);
Marker melbourne = mMap.addMarker(new MarkerOptions()
                          .position(MELBOURNE)
                          .alpha(0.7f));

定制标记图像

您可以用自定义标记图像(通常称作图标)替换默认标记图像。 自定义图标一律设置为 BitmapDescriptor,使用 BitmapDescriptorFactory 类中的四个方法之一定义。

fromAsset(String assetName)
使用资源目录中的图像创建自定义标记。
fromBitmap (Bitmap image)
使用位图图像创建自定义标记。
fromFile (String path)
使用指定路径处的文件创建自定义图标。
fromResource (int resourceId)
使用现有资源创建自定义标记。

下面这段代码可创建一个使用自定义图标的标记。

  private static final LatLng MELBOURNE = new LatLng(-37.813, 144.962);
  private Marker melbourne = mMap.addMarker(new MarkerOptions()
                            .position(MELBOURNE)
                            .title("Melbourne")
                            .snippet("Population: 4,137,400")
                            .icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow)));

将标记平面化

标记图标通常以屏幕为参照物进行绘制;旋转、倾斜或缩放地图均不会改变标记的朝向。您可以将标记的朝向更改为平贴地球表面。采用这种朝向的标记将随地图的旋转而旋转,并在地图倾斜时改变视角。平面标记将在地图缩放时保持大小不变。

如需更改标记的朝向,请将标记的 flat 属性设置为 true

static final LatLng PERTH = new LatLng(-31.90, 115.86);
Marker perth = mMap.addMarker(new MarkerOptions()
                          .position(PERTH)
                          .flat(true));

旋转标记

您可以通过 Marker.setRotation() 方法让标记围绕其锚点旋转。 旋转以与默认位置所呈顺时针角度来表示。 当地图上的标记为平面标记时,默认位置为北方。 如果标记不是平面标记,则默认位置为朝上,并且旋转角度会使标记始终面向摄像头。

以下示例代码可将标记旋转 90°。 将锚点设置为 0.5,0.5 可使标记围绕其中心而不是底部旋转。

static final LatLng PERTH = new LatLng(-31.90, 115.86);
Marker perth = mMap.addMarker(new MarkerOptions()
                          .position(PERTH)
                          .anchor(0.5,0.5)
                          .rotation(90.0));

标记事件

Maps API 允许您侦听和响应标记事件。 如需侦听这些事件,您必须在标记所属的 GoogleMap 对象上设置相应的侦听器。当地图上的其中一个标记发生事件时,将通过传递相应 Marker 对象作为参数来调用侦听器的回调。如需将此 Marker 对象与您自己对 Marker 对象的引用进行比较,您必须使用 equals(),而不能使用 ==

您可以侦听下列事件:

标记点击事件

您可以利用 OnMarkerClickListener 来侦听标记上的点击事件。 如需在地图上设置该侦听器,请调用 GoogleMap.setOnMarkerClickListener(OnMarkerClickListener)。当用户点击标记时,将会调用 onMarkerClick(Marker),并将标记作为参数进行传递。该方法返回的布尔值表示您是否使用了该事件(即您想禁止默认行为)。如果它返回 false,则除了发生自定义行为外,还会发生默认行为。标记点击事件的默认行为是,显示其信息窗口(如有),并通过移动摄像头让标记在地图上居中。

标记拖动事件

您可以利用 OnMarkerDragListener 来侦听标记上的拖动事件。 如需在地图上设置该侦听器,请调用 GoogleMap.setOnMarkerDragListener。 如需拖动标记,用户必须长按标记。 当用户的手指离开屏幕后,标记将保持在该位置。 拖动标记时,开始时会调用 onMarkerDragStart(Marker)。 拖动标记期间将不断调用 onMarkerDrag(Marker)。 拖动结束时调用 onMarkerDragEnd(Marker)。 您可随时通过调用 Marker.getPosition() 获取标记的位置。

注:默认情况下,标记无法拖动。 必须显式地将标记设置为可拖动,方可由用户进行拖动。 这可以通过在向地图添加标记前使用 MarkerOptions.draggable(boolean),或者在向地图添加标记后使用 Marker.setDraggable(boolean) 来实现。

发送以下问题的反馈:

此网页
Google Maps Android API
Google Maps Android API
需要帮助?请访问我们的支持页面