最近要做一个基于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);
}
}