HERE SDK Lite中MapMarker拖拽问题:如何拾取标记而非多边形
解决HERE SDK Lite中MapMarker被多边形遮挡无法拾取的问题
这个问题的核心是拾取优先级和绘制层级的冲突:默认情况下,多边形(VectorPolygon)的绘制层级可能比MapMarker更高,导致你拾取时最先命中的是多边形而非Marker。下面给你两种有效的解决方案:
方案1:提升Marker的绘制层级(推荐)
通过给Marker设置更高的zIndex,让它绘制在多边形的上方,这样拾取操作会优先识别到Marker。
在创建Marker的时候添加zIndex设置:
// 示例:创建Marker时设置更高的zIndex GeoCoordinates markerCoords = new GeoCoordinates(52.530932, 13.384915); MapMarker marker = new MapMarker(markerCoords); marker.setZIndex(100); // 数值大于多边形的默认zIndex(通常为0) map.getMapScene().addMapMarker(marker);
方案2:主动筛选拾取结果中的Marker
如果不想调整绘制层级,可以在拾取回调中主动遍历所有被拾取到的Marker,而不是依赖getTopmostMarker()(该方法只返回最上层的Marker,若上层是多边形则返回null)。
修改你的pickMarker方法:
public void pickMarker(Point2D p) { map.getGestures().disableDefaultAction(GestureType.PAN); map.pickMapItems(p, 20f, pickMapItemsResult -> { if (pickMapItemsResult != null) { // 获取所有被拾取到的Marker列表 List<MapMarker> pickedMarkers = pickMapItemsResult.getMarkers(); if (!pickedMarkers.isEmpty()) { pickedMarker = pickedMarkers.get(0); // 取第一个命中的Marker } else { // 没有拾取到Marker,立即恢复Pan手势 map.getGestures().enableDefaultAction(GestureType.PAN); pickedMarker = null; } } else { map.getGestures().enableDefaultAction(GestureType.PAN); pickedMarker = null; } }); }
额外优化建议
- 在
PanListener的BEGIN状态中,如果没有拾取到Marker,要及时恢复Pan手势,避免用户无法平移地图:mapView.getGestures().setPanListener((gestureState, point2D, point2DUpdate, v) -> { if (gestureState.equals(GestureState.BEGIN)) { mapViewUIEngine.pickMarker(point2D); // 新增:如果没有拾取到Marker,直接恢复Pan if (mapViewUIEngine.pickedMarker == null) { map.getGestures().enableDefaultAction(GestureType.PAN); } } // ... 其余逻辑保持不变 }); - 确保
releaseMarker方法中无论是否成功拖拽,都能重置pickedMarker并启用Pan手势,避免出现异常状态。
内容的提问来源于stack exchange,提问作者Thomas Gramer
相关产品推荐
相关产品推荐

