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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值