在Google Map(一) 中,我们学习了怎么样在手机中显示google地图,但是知道怎么显示地图是远远不够得,我们要利用它来做一些对我们有用的事情,今天我们要做的是:在google map上的某个经纬度显示一张图片,并且我们点击图片会弹出一个对话框,显示一些信息。
涉及到的知识点:
Maps API Key的获取,AlertDialog对话框的使用,Overlay抽象类,OverlayItem类,GeoPoint类。
先分别介绍下这几个类:
AlertDialog类:显示对话框
Overlay抽象类:图层,地图上显示的标记就是放在图层上,他有两个继承它的子类:ItemizedOverlay,MyLocationOverlay
OverlayItem类:地图上显示的标记
GeoPoint类:通过经纬度指定地图上的一个点
下面就来完成上面所提及的功能:
1、首先要在AndroidManifest.xml中添加the standard Android library,在AndroidManifest.xml的application节点中添加如下内容:
<uses-library android:name="com.google.android.maps" />
另外还要开通网络权限,在manifest的child节点中添加如下:
<uses-permission android:name="android.permission.INTERNET" />
AndroidManifest.xml完整代码如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="weiyong.googlemap1" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <uses-library android:name="com.google.android.maps" /> <activity android:name=".googlemap1" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.INTERNET" /> </manifest>
2、打开res/layout/main.xml,在里面添加com.google.android.maps.MapView节点:
<?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="0JF2BOEcpjLIf3HVmXn28EL-ahyk_mJbHBICUeg"
/><!-- 这个apiKey是我申请的,各不一样,你们要用使用自己的apiKey -->
配置文件到这里也就结束了,下面是要完成编码。
这里要说明一点:在google map上(MapView)放置标记(OverlayItem)的时候,我们必须放在中间层一个叫做图层(Overlay)的层上,所以在MapView之上创建一个图层,需要创建一个类,实现Overlay,并生成该类的对象,然后对该对象添加到MapView。【通过MapView.getOverlays()】
3、新建一个图层类:HelloItemizedOverlay,继承ItemizedOverlay(Overlay的子类):
public class HelloItemizedOverlay extends ItemizedOverlay<OverlayItem> {
HelloItemizedOverlay类的完整代码如下,附加详细的注释:
import java.util.*;
import android.app.AlertDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;
/**
* 在MapView之上创建一个图层,需要创建一个类,实现Overlay,并生成该类的对象,
* 然后对该对象添加到MapView。【MapView.getOverlays()】
* 一个OverlayItem对象代表了一个地图上显示的标记
*/
public class HelloItemizedOverlay extends ItemizedOverlay<OverlayItem> {
//创建一个list对象,用于持有该图层中所有的标记数
private List<OverlayItem> overlayItem = new ArrayList<OverlayItem>();
private Context context = null;
//第一个参数用于指定标记所使用的默认图片
public HelloItemizedOverlay(Drawable defaultMarker, Context context) {
//必须调用父类的构造方法
super(boundCenterBottom(defaultMarker));
this.context = context;
}
public HelloItemizedOverlay(Drawable defaultMarker) {
super(boundCenterBottom(defaultMarker));
}
//用于生成还得OverlayItem对象添加到list中
public void addOverlay(OverlayItem overlay) {
overlayItem.add(overlay);
populate();//一旦有新overlayItem数据进来,在调用其他方法之前必须先调用populate()方法
}
// 创建一个OverlayItem索引
@Override
protected OverlayItem createItem(int i) {
return overlayItem.get(i);
}
// 返回当前的Overlay当中所包含的OverlayItem对象
@Override
public int size() {
return overlayItem.size();
}
// 当用户点击标记的时候所调用的函数
@Override
protected boolean onTap(int index) {
OverlayItem item = overlayItem.get(index);
AlertDialog.Builder dialog = new AlertDialog.Builder(context);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());
dialog.show();
return true;
}
}
4、Activity类googlemap1类不是和以往一样继承Activity类,而是继承MapActivity类。
public class googlemap1 extends MapActivity {
具体代码如下:
import java.util.List;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;
public class googlemap1 extends MapActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
MapView mapView = (MapView) findViewById(R.id.mapview);
//设置mapView显示用于缩放的工具条
mapView.setBuiltInZoomControls(true);
//调用mapView对象的getOverlays()方法,用于得到所有的图层对象
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.icon);//引用android自带的图片
HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable,this);
//创建一个GeoPoint对象,通过经纬度指定地图上的一个点
GeoPoint point = new GeoPoint(19240000,-99120000);
//创建一个OverLayItem对象
OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!");
//将创建好的OverlayItem对象添加到HelloItemizedOverlay对象中
itemizedoverlay.addOverlay(overlayitem);
//将HelloItemizedOverlay对象添加到mapView
mapOverlays.add(itemizedoverlay);
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
}