您的位置:首页 > 其它

在MapView中增加Point,并可以响应点击事件

2010-06-26 21:52 295 查看


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

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: