前言
本文是官方教程的中文翻譯,講的是Google地圖的使用,續接上篇。(下載源碼)
第二部分:添加Overlay Items
現在,你已經有了一張地圖,但是在許多情況下,你需要建立自己的地表徵圖記和圖層。那麼接下來我們就來完善這個功能。要達到我們的目的,我們要繼承ItemizedOverlay 類,它可以提供給我們所需的 Overlay集合(Overlay是覆蓋的意思,本人覺得可以翻譯為“圖層”)。
1.窗建一個java類命名為HelloItemizedOverlay 並且繼承ItemizedOverlay類,為了便於觀察和結構的清晰,此處,我建立了一個java檔案,把該類放到到裡面。
2.為該類聲明成員變數,首先是一個OverlayItem ArrayList,我們的圖層元素就是放到這裡面的。
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
3.現在重寫構造器,調父類構造器傳入Drawable 參數時,先用boundCenterBottom()方法綁定一下,如果沒有把圖片綁定的話,是沒有效果的,也就是不能在地圖上正確顯示該塗層。
public HelloItemizedOverlay(Drawable defaultMarker)
{
super(boundCenterBottom(defaultMarker));
}
4.In orde如果要把圖層添加到集合中還要定義addOverlay()方法:
public void addOverlay(OverlayItem overlay)
{
mOverlays.add(overlay);
populate();
}
需要提醒的是,每次執行該函數的時候,最後都要調用populate() 方法,這個方法會讀取集合中的每一個元素,為繪製到螢幕做準備。
5.當執行了populate()方法時,它會調用createItem(int)方法來正式建立每個 圖層元素:
@Override
protected OverlayItem createItem(int i)
{
return mOverlays.get(i);
}
6.同樣重寫size() ,返回當前集合中圖層元素個數:
@Override
public int size()
{
return mOverlays.size();
}
7.我們再寫一個構造器,這個很關鍵,這一步的話,原教程貌似是有問題的,本人經實踐發現此處也應該在調父類構造器時將Drawable參數用boundCenterBottom綁定,另外就是獲得內容相關的引用:
public HelloItemizedOverlay(Drawable defaultMarker, Context context)
{
super(boundCenterBottom(defaultMarker));
mContext = context;
}
8.現在T重寫onTap()回調方法,他負責處理使用者點擊圖層元素的事件:
@Override
protected 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;
}
從代碼中可以看出,它的效果就是,當單擊地圖上我們添加的表徵圖時,彈出一個對話方塊,告訴我們你單擊的對象的相關資訊。
至此,我們已經完成對HelloItemizedOverlay 的編寫,可以回到HelloGoogleMaps 去調用他了。
9.首先需要一張用於圖層顯示的圖片,把它放在項目的res/drawable/檔案夾下面
10.在OnCreate()方法末尾繼續添加代碼:
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable);
11.所有的圖層元素在地圖裡面都由MapView來承載,因此如果你想添加一些圖層元素,那麼就要通過 getOverlays()來獲得一個list列表,然後為他們指定圖片,這些在HelloItemizedOverlay 中我們已經處理好了。
12.現在建立一個地理位置的座標點 GeoPoin,用於指定第一個圖層元素的擺放位置,然後把它傳給新的OverlayItem:
GeoPoint point = new GeoPoint(19240000,-99120000);
OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!");
GeoPoint 的參數使用微度為單位(degrees * 1e6). OverlayItem 的構造器接受的參數有GeoPoint 座標,標題,內容摘要。
13.最後我們就可以把OverlayItem 添加到HelloItemizedOverlay 執行個體中的集合了,再把執行個體添加到地圖:
itemizedoverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedoverlay);
14.運行程式,正常的話可以看到如下效果:
當你單擊表徵圖時,會彈出對話方塊。(下載源碼)