在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; } }