2012年8月9日 星期四

Android:ItemizedOverlay為地圖標上地標


package com.example.mapitemizedoverlay;

import ...

public class MainActivity extends MapActivity {
MapView map;
//因為內部類別會用到,只好把目標地理變數變成全域變數
GeoPoint ntuGeo;
//宣告內部類別變數,此類別繼承ItemizedOverlay,因此代表一個Overlay(圖層)
HelloItemizedLayer mylayer;
//宣告一個List容器,用來裝MapView上的Overlay
List<Overlay> mapoverlay;
   
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        map=(MapView)findViewById(R.id.mapview);
        MapController  con=map.getController();
        con.setZoom(18);
        map.setBuiltInZoomControls(true);
       
        double x=25.019943,y=121.542353;
        ntuGeo=new GeoPoint((int)(x*1e6), (int)(y*1e6));
        con.animateTo(ntuGeo);
       //Access the overlay list. 取得MapView上維護那些Overlay的列表
        mapoverlay=map.getOverlays();
        //建立Drawable物件,取得其圖檔資源
        Drawable draNtu=this.getResources().getDrawable(R.drawable.ic_launcher);
        //設定邊界
        draNtu.setBounds(0, 0, draNtu.getMinimumWidth(), draNtu.getMinimumHeight());
        //建立內部類別變數物件,建構參數為一個Drawable物件,而預設的建構子方法變會將圖形給繪製出。如底下匿名類別中。類別建構子所示
        mylayer=new HelloItemizedLayer(draNtu);
        //將自訂的類別也就是Overlay(圖層)給加進裝Overlay的List中
        mapoverlay.add(mylayer);
    }

 
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}


//內部類別,繼承 ItemizedOverlay
private class HelloItemizedLayer extends ItemizedOverlay<OverlayItem>{
//建構一個裝OverlayItem(圖標)的列表,負責儲存多個圖標,雖然本例只用一個
List<OverlayItem> items=new ArrayList<OverlayItem>();
//建構子,負責將由主程式傳來的圖標設定給繪製出來
public HelloItemizedLayer(Drawable arg0) {
super(arg0);
// TODO Auto-generated constructor stub
//加進一個OverlayItem物件,伴隨著(地點座標物件,標題字串,說明字串)
items.add(new OverlayItem(ntuGeo, "台大(標題)", "台灣大學"));
//此方法負責ItemizedOverlay建構背後所需動作,一定要加!!
populate();

}

@Override
//由populate()呼叫,他會決定哪些圖標會出現在地圖上,並且該圖標物件從items中取
          出
//參數index代表取出物件之索引
protected OverlayItem createItem(int index) {
// TODO Auto-generated method stub
return items.get(index);
}

@Override
//一樣由populate()呼叫,決定要取出幾個圖標物件
public int size() {
// TODO Auto-generated method stub
return items.size();
}

@Override
//使用者點選圖標的反應,在這邊是Show出一個對話欄
protected boolean onTap(int index) {
// TODO Auto-generated method stub
new AlertDialog.Builder( MainActivity.this)
//取得圖標物件的Title
.setTitle(items.get(index).getTitle())
//取得圖標物件的內容說明
.setMessage(items.get(index).getSnippet())
.show();

return true;
}

}
   

}

沒有留言:

張貼留言