天天看點

在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);

        }

    }