Android SDK Tutorials系列 - Hello Views - Google Map View

来源:互联网 发布:sublime2 安装python 编辑:程序博客网 时间:2024/05/17 22:36

Google Map View

可以使用Google地图库来创建自己的地图应用。本教程里,将创建一个简单的地图应用,分两部分:1. 创建一个地图应用,用户可以移动和缩放; 2. 添加一些项用来标注感兴趣的点。

本教程需要SDK开发环境已经安装了Google地图库。地图库包含在Google API扩展里,可以通过Android SDK和AVD管理器来安装。请参考添加SDK组件学习如何安装。

把Google API扩展安装到你的SDK以后,修改应用工程属性,设置编译目标是"Google APIs by Google Inc."。为了设置好你的开发环境,请查看在Eclipse创建和管理工程和在命令行创建和管理工程里关于设置编译目标的说明。

同时,你也要创建一个新的AVD,将Google API作为部署目标。查看创建和管理虚拟设备获得更多信息。

第一部分:  创建一个地图Activity

  1. 创建一个工程:HelloGoogleMaps.
  2. 因为地图库包含在标准Android库里,所以必须在Android Manifest里面声明要使用它。打开AndroidManifest.xml 文件,将下面的内容添加为<application> 的子元素:
    <uses-library android:name="com.google.android.maps" />
  3. 同时需要访问互联网来获取地图文件,因此必须申请INTERNET权限。在manifest文件里,将下面的内容添加为<manifest>的子元素:
    <uses-permission android:name="android.permission.INTERNET" />
  4. 继续修改manifest文件,使用"NoTitleBar"主题去除标题栏,给地图留出更大的显示空间:
    <activity android:name=".HelloGoogleMaps" android:label="@string/app_name"     android:theme="@android:style/Theme.NoTitleBar">
  5. 打开 res/layout/main.xml 文件并修改如下:
    <?xml version="1.0" encoding="utf-8"?><com.google.android.maps.MapView    xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/mapview"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:clickable="true"    android:apiKey="Your Maps API Key goes here"/>

    属性android:clickable 定义是否允许用户操作地图,如果设置为"false",触摸地图时会没有反应。

    属性android:apiKey 保存应用的地图API Key,这个用来证明你的应用和签名证书已经在Google 地图服务里注册过了。为了获得地图数据,Key是必须的,哪怕你实在开发过程中。注册服务是免费的,只需要几分钟就能注册好证书并获得一个地图API Key。

    现在去获取一个Key。请阅读相关说明:获得地图API Key 。为了本教程,你应该注册一个SDK调试证书 ,这个证书只在你的应用使用调试Key签名的时候才有效(一旦你想为应用使用一个私有Key,你需要重新申请一个新的API Key)。把你获得的Key设置为属性android:apiKey的值。

  6. 打开 HelloGoogleMaps.java 文件,修改基类为MapActivity (代替android.app.Activity):

    public class HelloGoogleMaps extends MapActivity {

    MapActivity是Activity的子类,由地图库提供,提供了重要的地图功能。

  7. 在每个MapActivity里面,都要实现isRouteDisplayed() 方法,重写该方法:
    @Overrideprotected boolean isRouteDisplayed() {    return false;}

    这个方法用于地图服务统计你的应用现在有没有显示任何路线信息。本例里面没有显示路线信息,因此返回否。

  8. 现在添加onCreate()方法(应该已经默认生成了):
    @Overridepublic void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main);}

    上面的代码加载布局文件。事实上,现在这已经是一个可以工作的应用了,能显示地图并让用户移动,但还不支持缩放。幸运的是,MapView已经内嵌一个很简单的缩放功能了,可以使用setBuiltInZoomControls(boolean)方法激活缩放功能。在onCreate()方法末尾添加下面的代码:

        MapView mapView = (MapView) findViewById(R.id.mapview);    mapView.setBuiltInZoomControls(true);
  9. 第一部分就这么多了。运行应用。(记住,你必须已经有一个AVD使用Google API目标,或者有一个开发设备拥有地图库。)

第二部分:添加图层项目

现在,已经有了一张地图,但是很多时候,你也需要创建自己的地图标记和悬浮信息。这就是你要现在要做的。为了实现这个功能,你必须实现ItemizedOverlay 类,这个类负责管理整个一组图层(放在地图上的个体项)。

  1. 创建一个Java类HelloItemizedOverlay 来定制类ItemizedOverlay.

    如果使用的开发工具是Eclipse,在Eclipse Package Explorer栏里,右键包名,选择New > Class. 然后在名字一栏填HelloItemizedOverlay.基类填"com.google.android.maps.ItemizedOverlay". 选中 Constructors from superclass. 点击Finish按钮。

  2. 首先,你需要一个存放OverlayItemArrayList,在里面存放每一个你想放在地图上的OverlayItem对象。将下面的代码放到类HelloItemizedOverlay的开头:
    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
  3. 现在定义类HelloItemizedOverlay 的构造函数。构造函数必须为每个OverlayItem定义一个默认标记。为了让Drawable真正地被显示出来,必须定义它的显示位置。最通常的时候,你希望图片底部的中心点就是你要标记到地图上的坐标。方法boundCenterBottom() 就是用来实现这个功能的。构造函数代码如下:
    public HelloItemizedOverlay(Drawable defaultMarker) {  super(boundCenterBottom(defaultMarker));}
  4. 为了将新的OverlayItem对象放到ArrayList里面,需要增加一个新的方法:
    public void addOverlay(OverlayItem overlay) {    mOverlays.add(overlay);    populate();}

    每添加一个OverlayItemArrayList,都必须为ItemizedOverlay调用方法populate(),这个方法读取每一个OverlayItem,从而为显示它们做好准备。

  5. 在方法populate() 里面,会循环调用ItemizedOverlay 的方法createItem(int)来检索每一个OverlayItem。你必须重写这个方法,正确地从ArrayList读取给定位置上的OverlayItem 并返回该对象。重写方法如下:
    @Overrideprotected OverlayItem createItem(int i) {  return mOverlays.get(i);}
  6. 同样必须重写方法size() 来反馈ArralyList里面现有项的数量:
    @Overridepublic int size() {  return mOverlays.size();}
  7. 现在建立能处理图层项被触碰事件的功能。首先,需要一个成员变量来保存应用Context的引用。因此增加一个类成员Context mContext,然后增加一个新的构造函数来初始化它:
    public HelloItemizedOverlay(Drawable defaultMarker, Context context) {  super(defaultMarker);  mContext = context;}

    传一个跟默认构造函数里一样的defaultMarker 来设置它的坐标,然后通过给定的Context来初始化mContext

    然后重写onTap(int) 回调函数来处理用户触碰一个项的事件:

    @Overrideprotected 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;}

    这个函数里,使用成员mContext来创建一个警告对话框AlertDialog.Builder ,然后设置被触碰的OverlayItem的标题和摘要作为对话框的标题和内容。(将在下面看到所定义OverlayItem的标题和摘要。)

已经完成了类HelloItemizedOverlay ,可以开始用它来向地图添加图层项了。

回到类HelloGoogleMaps 。在下面的步骤里,将创建一个OverlayItem,然后将它添加到类HelloItemizedOverlay 的实例里面,再将HelloItemizedOverlay 添加到MapView里面,通过一个GeoPoint来设定添加到地图的坐标。

  1. 首先,地图图层标记需要一个图片。如果手头没有,可以用右侧的Android图标。将该图片放到目录res/drawable/ 下面: androidmarker
  2. 在方法onCreate() 末尾添加以下内容:
    List<Overlay> mapOverlays = mapView.getOverlays();Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable);

    地图上所有的图层元素都被MapView持有着,如果想添加一些图层,必须调用方法getOverlays() 来获得图层列表。然后实例化一个在地图标记里用到的图像,图像保存在res/drawable/ 目录下。HelloItemizedOverlay 的构造函数使用这个图像来为所有的图层项目设置默认标记。

  3. 现在创建一个GeoPoint,为第一个图层项定义地图坐标,并把它传给一个新的OverlayItem对象
    GeoPoint point = new GeoPoint(19240000,-99120000);OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!");

    GeoPoint坐标单位是微度(degrees * 1e6)。OverlayItem 的构造函数接收3个参数:GeoPoint位置,一个字符串标题和一个字符串摘要。

  4. 剩下的事就是把这个OverlayItem 添加到HelloItemizedOverlay 实例的OverlayItem 集合里,然后将HelloItemizedOverlay 添加到MapView里面:
    itemizedoverlay.addOverlay(overlayitem);mapOverlays.add(itemizedoverlay);
  5. 运行应用。

应该能看到如下地图:

Hello GoogleMaps

当你触碰图层项,将会弹出对话框。

因为类ItemizedOverlay 使用 java.util.ArrayList来保存所有的OverlayItem,所以很容易添加更多的图层项。尝试添加另外一个:在方法调用addOverlay()语句上面,添加下面的行:

GeoPoint point2 = new GeoPoint(35410000, 139460000);OverlayItem overlayitem2 = new OverlayItem(point2, "Sekai, konichiwa!", "I'm in Japan!");

重新运行应用。(可能需要移动地图来查找新的图层项。)


返回 Android SDK Tutorials系列 - Hello Views

转载请注明出处:http://blog.csdn.net/mtding/article/details/6966733