点击多边形时OnMapClickListener未触发,如何获取多边形内点击的LatLng?
解决多边形内部点击无法获取LatLng的问题
这个问题我之前也碰到过!核心原因是Google Maps里的多边形默认会拦截其内部的点击事件,导致你的OnMapClickListener接收不到多边形区域内的点击回调——这就是为什么外部点击正常、内部没反应的根源。
下面给你两种靠谱的解决思路,根据你的需求选就行:
方案一:关闭多边形的点击拦截,自行判断点击位置(推荐,简单直接)
如果不需要给多边形本身设置点击交互(比如点击多边形不需要额外操作),直接把多边形的clickable属性设为false,这样它就不会拦截点击事件,OnMapClickListener就能收到所有区域的点击,之后再用Polygon.contains(LatLng)方法判断点击点是否在多边形内部即可。
示例代码:
// 创建多边形时,设置clickable为false,禁止它拦截点击 Polygon polygon = mMap.addPolygon(new PolygonOptions() .addAll(yourPolygonVertexList) // 替换成你的多边形顶点集合 .clickable(false)); // 关键设置 // 给地图设置点击监听 mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() { @Override public void onMapClick(LatLng clickedLatLng) { // 判断点击点是否在多边形内部 if (polygon.contains(clickedLatLng)) { // 这里就是你要的多边形内点击坐标,处理放置标记的逻辑 Log.d("MapClick", "多边形内点击坐标:" + clickedLatLng.latitude + ", " + clickedLatLng.longitude); } else { // 外部点击的原有逻辑 Log.d("MapClick", "多边形外点击坐标:" + clickedLatLng.latitude + ", " + clickedLatLng.longitude); } } });
方案二:保留多边形点击交互,同时获取点击位置
如果需要保留多边形的点击功能(比如点击多边形要显示详情弹窗),可以结合触摸监听和多边形点击监听来实现:先通过OnMapTouchListener记录每次触摸结束时的坐标,再在OnPolygonClickListener触发时使用这个坐标。
示例代码:
private LatLng lastClickedLatLng; // 全局变量,保存最后一次触摸的坐标 // 先设置地图触摸监听,记录触摸结束时的坐标 mMap.setOnMapTouchListener(new GoogleMap.OnMapTouchListener() { @Override public void onTouch(MotionEvent motionEvent) { if (motionEvent.getAction() == MotionEvent.ACTION_UP) { // 将屏幕触摸坐标转换为地图上的LatLng Projection projection = mMap.getProjection(); Point touchPoint = new Point((int) motionEvent.getX(), (int) motionEvent.getY()); lastClickedLatLng = projection.fromScreenLocation(touchPoint); } } }); // 再设置多边形点击监听 mMap.setOnPolygonClickListener(new GoogleMap.OnPolygonClickListener() { @Override public void onPolygonClick(Polygon polygon) { if (lastClickedLatLng != null && polygon.contains(lastClickedLatLng)) { // 这里就是多边形内的点击坐标 Log.d("PolygonClick", "多边形内点击坐标:" + lastClickedLatLng); // 处理放置标记+多边形点击的逻辑 } } });
注意事项
Polygon.contains(LatLng)方法支持判断复杂多边形(包括带洞的多边形),准确性没问题;- 方案二中要注意处理
lastClickedLatLng为空的情况(比如用户快速连续点击时),可以加个非空判断避免空指针。
内容的提问来源于stack exchange,提问作者Łukasz Szczeciński
相关产品推荐
相关产品推荐

