最近要做一個基于google map的app,需要在app中增加标記點,并且點選标記點後可以顯示出一個内容簡介的提示框。點選提示框後,可以響應點選事件,跳轉到其他地方。找了和那多資料,才找到方法。
增加标記點,可以使用ItemzedOverlay這個東西,然後向其中增加GeoPoint和marker所要是以用的圖檔,就可以進行标記點的顯示。在增加marker時要注意,這是一個Drawable的圖,必須進行下bound的轉換。可以直接用drawable.setBounds(0,0,drawable.getWidth(),drawable.getHeight() );但這樣出來的drawable,在地圖顯示後,是以左上角來對應GeoPoint的坐标的,這就不對了。可以直接用ItemzedOverlay的boundCenterBottom()方法,進行對drawable轉換,這樣出來的圖,是以底部中間點為指向GeoPoint的坐标,這就顯示正常了。
點加上去了,還要在點選标記點後,要顯示出一個提示框。好多文章裡都說是直接重寫ItemzedOverlay的draw方法、這樣是可以描繪出一個框。但卻不能相應在提示框上的點選事件。最後發現可以在MapView中addChild一個你想作為提示框的View,例如TextView。然後再ItemzedOverlay的onTap時。擷取到所點選的GeoPoint,然後将這個Point付給TextView的LayoutParams。(此時這個LayoutParams應該是MapView.LayoutParams);之後這個TextView就會出現在所點選的GeoPoint所在的位置。這樣也就可以給TextView增加點選事件了。
源碼如下
要建立自己的Overlay
public class PoiItemizedOverlay extends ItemizedOverlay<OverlayItem> {
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
public PoiItemizedOverlay(Drawable defaultMarker) {
super(boundCenterBottom(defaultMarker));
}
public void addOverlay(OverlayItem overlay) {
mOverlays.add(overlay);
populate();
}
public void clear() {
mOverlays.clear();
populate();
}
public Drawable centerBottomMarker(Drawable marker) {
return boundCenterBottom(marker);
}
public Drawable centerMarker(Drawable marker) {
return boundCenter(marker);
}
@Override
protected OverlayItem createItem(int i) {
return mOverlays.get(i);
}
@Override
public int size() {
return mOverlays.size();
}
@Override
public boolean onTap(GeoPoint p, MapView mapView) {
selectedPoi = null;
pinSnippet.setVisibility(View.GONE);
return super.onTap(p, mapView);
}
@Override
protected boolean onTap(int index) {
PoiOverlayItem item = (PoiOverlayItem) getItem(index);
selectedPoi = item;
GeoPoint selectedPoint = item.getPoint();
MapView.LayoutParams layoutParams = (MapView.LayoutParams) pinSnippet
.getLayoutParams();
layoutParams.point = selectedPoint;
layoutParams.alignment = MapView.LayoutParams.BOTTOM_CENTER;
Drawable marker = item
.getMarker(OverlayItem.ITEM_STATE_SELECTED_MASK);
if (marker == null) {
marker = pinDefault;
}
pinSnippet.setPadding(0, 0, 0, marker.getIntrinsicHeight());
pinSnippet.setLayoutParams(layoutParams);
pinSnippet.setVisibility(View.VISIBLE);
txtPinSnippet.setText(item.getSnippet()); // txtPinSnippet是用來顯示點選坐标點後,提示内容的框。
return super.onTap(index);
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
super.draw(canvas, mapView, false);
}
@Override
public boolean onTouchEvent(MotionEvent event, MapView mapView) {
return super.onTouchEvent(event, mapView);
}
}