3.1 问题
除了将指定的位置显示在地图的中心,应用程序还需要在该位置上加上标记,以使其更加醒目。
3.2 解决方案
(API Level 9)
向地图添加Marker对象以及Circle和Polygon等形状元素。Marker对象是通过图标定义的交互式对象,该图标显示在给定位置。该位置可以是固定的,也可以设置Marker为可由用户拖动到他们希望的任意一点。每个Marker还可以响应触摸事件,如点击和长按。此外,可以为Marker提供包括标题的元数据和文本片段,当点击标记时会在弹出信息窗口中显示这些信息。这些窗口自身也可以定制显示。
Maps v2还支持绘制离散形状元素。这些元素在本质上是不可交互的,但我们会看到,可以轻松地添加与形状交互的功能。此功能也可以用于在地图上使用Polyline形状绘制路线,其不像其他选项一样会尝试绘制闭合的、填充的形状。
要点:
Google Maps v2是作为Google Play Services库的一部分进行分发的,它在任意平台级别都不是原生SDK的一部分。然而,目标平台为API Level 9或以后版本的应用程序以及Google Play体系内的设备都可以使用此绘图库。
3.3 实现机制
显示上一节的地图应用程序,其中使用标记添加了一些感兴趣的点。
以下两段代码清单显示了新的Activity示例,其中向地图添加了一些标记。XML布局与前一节中的相同,因此我们不会花费时间再次剖析其组成部分,只是为了完整性而在此添加此布局。
res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="Map Of Your Location" />
<RadioGroup
android:id="@+id/group_maptype"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<RadioButton
android:id="@+id/type_normal"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Normal Map" />
<RadioButton
android:id="@+id/type_satellite"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Satellite Map" />
</RadioGroup>
<fragment
class="com.google.android.gms.maps.SupportMapFragment"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
显示带有标记的地图的Activity
public class MarkerMapActivity extends FragmentActivity implements
RadioGroup.OnCheckedChangeListener,
GoogleMap.OnMarkerClickListener,
GoogleMap.OnMarkerDragListener,
GoogleMap.OnInfoWindowClickListener,
GoogleMap.InfoWindowAdapter {
private static final String TAG = "AndroidRecipes";
private SupportMapFragment mMapFragment;
private GoogleMap mMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//检查play services是否激活且为最新版本
int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
switch (resultCode) {
case ConnectionResult.SUCCESS:
Log.d(TAG, "Google Play Services is ready to go!");
break;
default:
showPlayServicesError(resultCode);
return;
}
mMapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mMap = mMapFragment.getMap();
// 监控与标记元素的交互
mMap.setOnMarkerClickListener(this);
mMap.setOnMarkerDragListener(this);
// 设置应用程序以服务信息窗口的视图
mMap.setInfoWindowAdapter(this);
// 监控信息窗口上的点击事件
mMap.setOnInfoWindowClickListener(this);
// Google 总部 ( 37.427,-122.099)
Marker marker = mMap.addMarker(new MarkerOptions()
.position(new LatLng(37.4218, -122.0840))
.title("Google HQ")
// 将来