`
hwy584624785
  • 浏览: 46246 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Google Map(二)

 
阅读更多

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

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics