0

我想在我长按地图时添加新的地方,我可以,但问题是当我添加覆盖时我无法移动地图。代码如下。

public class CustomPinPointOverlay extends ItemizedOverlay<OverlayItem> {

    private GeoPoint newMarkerLocation;

    public CustomPinPointOverlay(GeoPoint newMarkerLocation,
            Drawable defaultMarker) {

        super(boundCenterBottom(defaultMarker));
        this.newMarkerLocation = newMarkerLocation;
        populate();
    }

    @Override
    protected OverlayItem createItem(int i) {
        return new OverlayItem(this.newMarkerLocation, null, null);
    }

    public void draw(android.graphics.Canvas canvas, MapView mapView,
            boolean shadow) {
        super.draw(canvas, mapView, false);
    }

    @Override
    public int size() {
        return 1;
    }
}

这是我的覆盖类,它扩展了 itemizedoverlay。代码的其他部分是;

public PMapView(Context context, AttributeSet attrs) {
    super(context, attrs);

  setOnTouchListener(new OnTouchListener() {

        int x, y;
        long start, stop;


        @Override
        public boolean onTouch(View v, MotionEvent e) {

            if (e.getAction() == MotionEvent.ACTION_DOWN) {

                start = e.getEventTime();
                x = (int) e.getX();
                y = (int) e.getY();

                touchedPoint = map.getProjection().fromPixels(x, y);
            }
            if (e.getAction() == MotionEvent.ACTION_UP) {
                stop = e.getEventTime();

            }

            if (stop - start > 1000) {

                setEnabled(true);
                Drawable myMarker = getResources().getDrawable(
                        R.drawable.yeni_pin);
                getOverlays().add(
                        new CustomPinPointOverlay(touchedPoint, myMarker));


                return false;
            }


            return true;
        }


    });

}

这段代码有什么问题?

4

1 回答 1

1

这个答案假设您的 PMapView 扩展了 MapView。

如果上面的陈述是真的,你应该尝试调用你的超类onTouchEvent,除非你处理它。例如(这是您修改的代码,但我没有测试过)

@Override
    public boolean onTouch(View v, MotionEvent e) {

        boolean retValue = true;
        if (e.getAction() == MotionEvent.ACTION_DOWN) {

            start = e.getEventTime();
            x = (int) e.getX();
            y = (int) e.getY();

            touchedPoint = map.getProjection().fromPixels(x, y);
        }
        if (e.getAction() == MotionEvent.ACTION_UP) {
            stop = e.getEventTime();

        }

        if (stop - start > 1000) {

            setEnabled(true);
            Drawable myMarker = getResources().getDrawable(
                    R.drawable.yeni_pin);
            getOverlays().add(
                    new CustomPinPointOverlay(touchedPoint, myMarker));


            retValue = false;
        }

        if(!retValue)
            super.onTouchEvent(e);
        return retValue;
    }

上面的代码会将未捕获的动作(您的长按被捕获)传递回父级,以便它可以处理诸如移动地图之类的事情。此代码尚未经过测试,因此可能会产生奇怪的结果。您可能想删除if(!retValue)并始终调用super.onTouchEvent(e).

于 2011-12-15T19:57:13.593 回答