首先繼承抽象類別 ItemizedOverlay 並重寫onTap方法
class MyOverItem extends ItemizedOverlay<OverlayItem> {<br />private List<OverlayItem> GeoList = new ArrayList<OverlayItem>();<br />private Drawable marker;<br />private Context mContext;<br />//這裡寫死poi點。。可以從伺服器查詢獲得</p><p>private double mLat1 = 40.0506; // point1緯度<br />private double mLon1 = 116.288700; // point1經度<br />private double mLat2 = 40.051723;<br />private double mLon2 = 116.287741;<br />private double mLat3 = 40.052723;<br />private double mLon3 = 116.286741;<br />public MyOverItem(Drawable marker, Context context) {<br />super(boundCenterBottom(marker));<br />this.marker = marker;<br />this.mContext = context;</p><p>// 用給定的經緯度構造GeoPoint,單位是微度 (度 * 1E6)<br />GeoPoint p1 = new GeoPoint((int) (mLat1 * 1E6), (int) (mLon1 * 1E6));<br />GeoPoint p2 = new GeoPoint((int) (mLat2 * 1E6), (int) (mLon2 * 1E6));<br />GeoPoint p3 = new GeoPoint((int) (mLat3 * 1E6), (int) (mLon3 * 1E6));<br />// 構造OverlayItem的三個參數依次為:item的位置,標題文本,文字片段<br />GeoList.add(new OverlayItem(p1, "P1", "point1"));<br />GeoList.add(new OverlayItem(p2, "P2", "point2"));<br />GeoList.add(new OverlayItem(p3, "P3", "point3"));<br />//該方法應該是將當前的GeoList的overlay 同步到 父類ItemizedOverlay中的list中以進行重繪<br />//所以當GeoList資料發生變化時需要調用該方法<br />populate(); </p><p>}<br />@Override<br />public void draw(Canvas canvas, MapView mapView, boolean shadow) {<br />// Projection介面用於螢幕像素點座標系統和地球表面經緯度點座標系統之間的變換<br />Projection projection = mapView.getProjection();<br />for (int index = size() - 1; index >= 0; index--) { // 遍曆GeoList<br />OverlayItem overLayItem = getItem(index); // 得到給定索引的item<br />String title = overLayItem.getTitle();<br />// 把經緯度變換到相對於MapView左上方的螢幕像素座標<br />Point point = projection.toPixels(overLayItem.getPoint(), null);<br />Paint paintCircle = new Paint();<br />paintCircle.setColor(Color.RED);<br />canvas.drawCircle(point.x, point.y, 5, paintCircle); // 畫圓<br />Paint paintText = new Paint();<br />paintText.setColor(Color.BLACK);<br />paintText.setTextSize(15);<br />canvas.drawText(title, point.x, point.y - 25, paintText); // 繪製文本<br />}<br />super.draw(canvas, mapView, shadow);<br />//調整一個drawable邊界,使得(0,0)是這個drawable底部最後一行中心的一個像素<br />boundCenterBottom(marker);<br />}<br />@Override<br />protected OverlayItem createItem(int i) {<br />return GeoList.get(i);<br />}<br />@Override<br />public int size() {<br />return GeoList.size();<br />}<br />@Override<br />// 處理當點擊事件<br />//mapview的onTouch事件會傳播到overlay的 onTouch方法 通過點擊範圍可以確定觸發哪個overlay的onTap<br />protected boolean onTap(int i) {<br />setFocus(GeoList.get(i));<br />Toast.makeText(this.mContext, GeoList.get(i).getSnippet(),<br />Toast.LENGTH_SHORT).show();<br />return true;<br />}<br />}<br />
Google API中MapView可以獲得Overlay的列表
private void initOverlayItem(){<br /> Drawable marker = getResources().getDrawable(R.drawable.poi_1); //得到需要標在地圖上的資源</p><p> marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker<br />.getIntrinsicHeight()); //為maker定義位置和邊界</p><p>mapView.getOverlays().add(new MyOverItem(marker, this)); //添加ItemizedOverlay執行個體到mMapView<br /> }
MapView會 根據順序在onDraw方法中重繪