一步步教你用Android Google Map(二)

第五步:自定義地圖的圖層

  接下來,我們需要爲地圖多增加一些自定義的功能,比如可以在地圖上進行一些標註。爲了實現這樣的功能,我們可以繼承Overlay這個類,這個類是一個基類,提供了可以在地圖上添加圖層的基本功能。而另外的選擇是,我們可以繼承itemzedOverlay這個類,

  它提供了一種快捷的方法,可以把標記圖片和相關的文本分配給特定的地理位置。ItemizedOverlay實例可以處理每一個OverlayItem(OverlayItem可以簡單理解爲在地圖上的每一個標記)標記的繪製、放置、單擊處理、焦點控制和佈局優化。下面我們看代碼:

package com.javacodegeeks.android.googlemaps;
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方法將其展示出來。

  接下來我們看下如何使用上面的這個類,將代碼修改如下:

package com.javacodegeeks.android.googlemaps;

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的強大功能,更多的還有待讀者去實踐發現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章