上篇:Android Google Map應用執行個體 - 建立一個Google Map常式(Android mapview)
通常情況光有地圖還是不夠的,如何添加一個自訂的圖層,譬如說把一個熱點,一個基站地址標註在地圖上。如下步驟幫你完成Android Google Map
自訂圖層的添加
建立一個 ItemizedOverlay 類
- 建立一個 Java 類
HelloItemizedOverlay
在建立列表框中的 Superclass, 填入"com.google.android.maps.ItemizedOverlay". 選擇選項
Constructors from superclass.
- 需要 OverlayItem
ArrayList, 通過這個ArrayList將所需要的地標OverlayItem
標到地圖上. 在 HelloItemizedOverlay 類中添加:
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
- 定義建構函式
public HelloItemizedOverlay(Drawable defaultMarker) {
super(boundCenterBottom(defaultMarker));
}
- 為了將 OverlayItems 加到 ArrayList, 需要addOverlay方法:
public void addOverlay(OverlayItem overlay) {
mOverlays.add(overlay);
populate();
}
每添加一個OverlayItem 到ArrayList,需要調用 populate(),用來讀取所有的OverlayItems 並準備畫到圖層上。
- populate()方法執行完成後會調用createItem(int),重寫這個函數擷取ArrayList 中OverlayItem 的指示。
@Override
protected OverlayItem createItem(int i) {
return mOverlays.get(i);
}
- 重寫size函數:
@Override
public int size() {
return mOverlays.size();
}
- 下面來設定響應螢幕觸摸的函數,新增成員變數
private Context mContext;
添加一個新的建構函式:
public HelloItemizedOverlay(Drawable defaultMarker, Context context) {
this(defaultMarker);
this.mContext = context;
}
重寫 onTap(int) 函數, 用來響應的使用者的觸摸:
@Override
protected boolean onTap(int index) {
OverlayItem item =mOverlays.get(index);
AlertDialog.Builder dialog = newAlertDialog.Builder(mContext);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());
dialog.show();
return true;
}
HelloItemizedOverlay類完成了.
開啟HelloGoogleMaps 類.下面將建立 OverlayItem 並加到HelloItemizedOverlay 執行個體中, 並將HelloItemizedOverlay圖層加到MapView.
- 首先需要一個表徵圖的圖片,將檔案拖到
res/drawable/ 檔案夾下即可.
- 在 onCreate() 方法的後面, 加上:
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.XXXX);
//XXXX為表徵圖圖片的檔案名稱
HelloItemizedOverlay itemizedoverlay = newHelloItemizedOverlay(drawable,this);
- 建立GeoPoint , 並存入OverlayItem:
GeoPoint point = new GeoPoint(29578181,121512974);
OverlayItem overlayitem = new OverlayItem(point, "Hello!", "I'm in Chunhu!");
- 將 OverlayItem 添加入 HelloItemizedOverlay 執行個體,:
itemizedoverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedoverlay);
- 添加新標註:
GeoPointpoint3 = new GeoPoint(29578290,121613174);
OverlayItem overlayitem3 = newOverlayItem(point3, "Hello3!","I'm in Chunhu3!");
itemizedoverlay.addOverlay(overlayitem3);
- 在onCreate()方法後添加:
mymapController.setZoom(9); //設定地圖放大層級
- 運行程式得到如下左圖結果:
- 點擊表徵圖顯示如上右圖
詳細代碼:
HelloGoogleMaps.java檔案:
package com.google.maps.HelloGoogleMaps;<br />import java.util.List;<br />import android.app.Activity;<br />import android.graphics.drawable.Drawable;<br />import android.os.Bundle;<br />import com.google.android.maps.*;<br />public class HelloGoogleMaps extends MapActivity {<br /> /** Called when the activity is first created. */<br /> @Override<br /> public void onCreate(Bundle savedInstanceState) {<br /> super.onCreate(savedInstanceState);<br /> setContentView(R.layout.main);</p><p> MapView mapView = (MapView)findViewById(R.id.mapview);<br /> mapView.setBuiltInZoomControls(true);<br /> mapView.setEnabled(true);</p><p> MapController mymapController = mapView.getController();<br /> Double lng = 121.512974 * 1E6;<br /> Double lat = 29.578181 * 1E6;<br /> GeoPoint point = new GeoPoint( lat.intValue(),lng.intValue());<br /> mymapController.setCenter(point);//顯示中心<br /> mymapController.setZoom(9); //放大層級<br /> // mapView.setSatellite(true); //是否為衛星模式<br /> List<Overlay> mapOverlays = mapView.getOverlays();<br /> Drawable drawable = this.getResources().getDrawable(R.drawable.w9mt3knd);<br /> HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable,this);</p><p> GeoPoint point2 = new GeoPoint(29578181,121512974);<br /> OverlayItem overlayitem2 = new OverlayItem(point2, "Hello!", "I'm in Chunhu!");</p><p> GeoPoint point3 = new GeoPoint(29578290,121613174);<br /> OverlayItem overlayitem3 = new OverlayItem(point3, "Hello2!", "I'm in Chunhu2!");</p><p> itemizedoverlay.addOverlay(overlayitem2);<br /> itemizedoverlay.addOverlay(overlayitem3);<br /> mapOverlays.add(itemizedoverlay);<br /> }</p><p> @Override<br /> protected boolean isRouteDisplayed() {<br /> return false;<br /> }</p><p>}
H
e lloItemizedOverlay.java檔案
package com.google.maps.HelloGoogleMaps;<br />import java.util.ArrayList;<br />import android.app.AlertDialog;<br />import android.content.Context;<br />import android.graphics.drawable.Drawable;<br />import com.google.android.maps.ItemizedOverlay;<br />import com.google.android.maps.OverlayItem;<br />public class HelloItemizedOverlay extends ItemizedOverlay {<br /> private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();<br /> private Context mContext;</p><p> public HelloItemizedOverlay(Drawable defaultMarker) {<br /> //super(defaultMarker);<br /> super(boundCenterBottom(defaultMarker));<br /> // TODO Auto-generated constructor stub<br /> }<br /> public void addOverlay(OverlayItem overlay) {<br /> mOverlays.add(overlay);<br /> populate();<br /> }</p><p> @Override<br /> protected OverlayItem createItem(int i) {<br /> // TODO Auto-generated method stub<br /> return mOverlays.get(i);<br /> }<br /> @Override<br /> public int size() {<br /> // TODO Auto-generated method stub<br /> return mOverlays.size();<br /> }<br /> public HelloItemizedOverlay(Drawable defaultMarker, Context context) {<br /> //super(defaultMarker);<br /> this(defaultMarker);<br /> //mContext = context;<br /> this.mContext = context;<br /> }</p><p> @Override<br /> protected boolean onTap(int index) {<br /> OverlayItem item = mOverlays.get(index);<br /> AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);<br /> dialog.setTitle(item.getTitle());<br /> dialog.setMessage(item.getSnippet());<br /> dialog.show();<br /> return true;<br /> }<br />}
下篇:
Android Google Map應用執行個體 - 安裝到手機後的效果(Android mapview) Android Google Map應用執行個體 - 在地圖和衛星圖之間切換(Android mapview)
Android Google Map應用執行個體 - 添加GPS位置標註(Android mapview)
轉載本站文章請註明,轉載自:ADASiteMap的空間[http://www.adasitemap.tk]
本文連結:Android
Google Map執行個體 – 添加Google Map自訂圖層(Android mapview) | ADASiteMap的空間