第五步:自定義地圖的圖層
接下來,我們需要爲地圖多增加一些自定義的功能,比如可以在地圖上進行一些標註。爲了實現這樣的功能,我們可以繼承Overlay這個類,這個類是一個基類,提供了可以在地圖上添加圖層的基本功能。而另外的選擇是,我們可以繼承itemzedOverlay這個類,
它提供了一種快捷的方法,可以把標記圖片和相關的文本分配給特定的地理位置。ItemizedOverlay實例可以處理每一個OverlayItem(OverlayItem可以簡單理解爲在地圖上的每一個標記)標記的繪製、放置、單擊處理、焦點控制和佈局優化。下面我們看代碼:
import java.util.ArrayList;
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;
public class CustomItemizedOverlay extends ItemizedOverlay<OverlayItem> {
private ArrayList<OverlayItem> mapOverlays = new ArrayList<OverlayItem>();
private Context context;
public CustomItemizedOverlay(Drawable defaultMarker) {
super(boundCenterBottom(defaultMarker));
}
public CustomItemizedOverlay(Drawable defaultMarker, Context context) {
this(defaultMarker);
this.context = context;
}
@Override
protected OverlayItem createItem(int i) {
return mapOverlays.get(i);
}
@Override
public int size() {
return mapOverlays.size();
}
@Override
protected boolean onTap(int index) {
OverlayItem item = mapOverlays.get(index);
AlertDialog.Builder dialog = new AlertDialog.Builder(context);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());
dialog.show();
return true;
}
public void addOverlay(OverlayItem overlay) {
mapOverlays.add(overlay);
this.populate();
}
}
在這個類中,需要在構造函數中使用Drawable類,這將被用作來繪製一個標記。此外,我們使用ArrayList去保存所有的Overlayitems,而createitem和size方法則容易理解了,分別是返回每一個Overlayitem和返回目前的所有標記的數目。而onTap方法則是在當某個標記在地圖上真正標註時所觸發的,比如當在觸摸屏上點擊時,也可以觸發該事件。在這個例子中,我們只是通過彈出對話框的方法展示給用戶看。最後,在addOverlay方法中,我們向標記數組mapOverlays中增加一個overlayitem標記,並且調用populate方法將其展示出來。
接下來我們看下如何使用上面的這個類,將代碼修改如下:
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.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;
public class GMapsActivity extends MapActivity {
private MapView mapView;
private static final int latitudeE6 = 37985339;
private static final int longitudeE6 = 23716735;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView) findViewById(R.id.map_view);
mapView.setBuiltInZoomControls(true);
List<OVERLAY> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.icon);
CustomItemizedOverlay itemizedOverlay =
new CustomItemizedOverlay(drawable, this);
GeoPoint point = new GeoPoint(latitudeE6, longitudeE6);
OverlayItem overlayitem =
new OverlayItem(point, "Hello", "I'm in Athens, Greece!");
itemizedOverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedOverlay);
MapController mapController = mapView.getController();
mapController.animateTo(point);
mapController.setZoom(6);
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
}
在上面的代碼中,我們實例化了CustomItemizedOverlay類,併爲其構造函數傳入了Android默認的Drawable類的實例進行初始化,接下來,我們用一個預先定義好的經緯度去實例化一個GeoPoint類,GeoPoint類表示一個具體的位置。然後再用這個geopoint類的實例去初始化OverlayItem對象的實例,並且傳入一段文本,這樣就產生了一個完整的地圖上的標記了,最後把這個標記加入到圖層中去,這是通過調用CustomItemizedOverlay類的addOverlay去實現的,最後該標記就會出現在地圖上了。
最後,我們調用了MapController這個工具類去控制地圖的縮放,將地圖縮放到由
GeoPoint類的實例指定區域的位置(使用的是animateTo方法),並用setZoom()方法指定了放大的級別。
運行程序後,可以看到在地圖上只顯示了指定區域大小的地圖,並且看到了標記,當你點擊標記時,可以看到彈出的對話框和顯示的文字。
▲
總結
其實Android 搭配Google Map還能實現很多功能,比如GPS導航,結合SNS實現提供各類的LBS位置服務等,本文只是帶領你初窺了Android 搭配Google Map的強大功能,更多的還有待讀者去實踐發現。