【问题标题】:OSMDROID - longPressHelper only fires the first time when it is used to add a markerOSMDROID - longPressHelper 仅在第一次用于添加标记时触发
【发布时间】:2016-07-11 14:56:43
【问题描述】:

我正在使用 osmdroid 并实现了 MapEventsReceiver、MapEventsOverlay 和 LongPressHelper,以便在用户按住地图时添加新标记。这是第一次并且仅第一次有效。

如果我从我的 longPressHelper 中删除 addMarker(p);,那么它每次都会触发。

有人知道为什么会这样吗?

代码:

ma​​pviewInit - 在 onCreate 中调用 私有 void mapviewInit() {

    mapview = (MapView) findViewById(R.id.mapview);
    mapview.setTileSource(TileSourceFactory.MAPNIK);
    mapview.setBuiltInZoomControls(true);
    mapview.setMultiTouchControls(true);

    IMapController mapController = mapview.getController();
    mapController.setZoom(16);
    GeoPoint startPoint = new GeoPoint(48.8583, 2.2944);
    mapController.setCenter(startPoint);

    MapEventsReceiver meReceiver = new MapEventsReceiver() {

        @Override
        public boolean singleTapConfirmedHelper(GeoPoint p) {
            return false;
        }

        @Override
        public boolean longPressHelper(GeoPoint p) {

            Toast toast = Toast.makeText(getApplicationContext(), "DEBUGDEBUGDEBUG", Toast.LENGTH_LONG);
            toast.show();

            addMarker(p);



            return true;
        }
    };

addMarker - 由 LongPressHelper 调用 public void addMarker(GeoPoint geoPoint) {

    Drawable dr = getResources().getDrawable(R.drawable.icn_crosshair_red);
    Bitmap bitmap = ((BitmapDrawable) dr).getBitmap();
    Drawable d = new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(bitmap, 100, 100, true));

    mapview.getOverlays().clear();
    mapview.invalidate();

    selectedPosMarker = new Marker(mapview);
    selectedPosMarker.setPosition(geoPoint);

    selectedPosMarker.setInfoWindow(null);

    selectedPosMarker.setIcon(d);
    selectedPosMarker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM);


    mapview.getOverlays().add(selectedPosMarker);
    mapview.invalidate();
}

【问题讨论】:

    标签: java android geolocation onclicklistener osmdroid


    【解决方案1】:

    我假设您在您未提供的部分代码中的某处添加了 MapEventsOverlay。 问题是您在 addMarker 中将其删除! :

    mapview.getOverlays().clear();
    

    所以当然不会出现第二次对长按做出反应...

    不要在同一个方法中调用 mapview.invalidate() 两次,这样既无用又耗时。

    【讨论】:

    • 嗯嗯好的。我实际上打算做的只是从屏幕上删除标记,以便可以再次重新添加......无论如何我可以删除标记而不删除整个覆盖?感谢您的帮助和回复
    • mapview.getOverlays().remove(selectedPosMarker);您也可以只将现有标记移动到新位置,而无需删除/创建。
    猜你喜欢
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 2020-01-02
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    相关资源
    最近更新 更多