如何检测折线的点击事件

13

如果在Google地图上有一条折线(polyline),并且在地图上执行了点击操作,那么我该如何检查该点击是否在折线上还是其他位置?

Polyline line = googleMap.addPolyline(new PolylineOptions()
       .add(new LatLng(51.2, 0.1), new LatLng(51.7, 0.3))
       .width(5)
       .color(Color.RED));

googleMap.setOnMapLongClickListener(new OnMapLongClickListener() {          

    }
});

你能否请发布一些代码? - Haresh Chhelana
@Haresh 我正在尝试通过 MapClickListener 检查折线的点击,因为我在它的文档中没有找到特定的折线点击方法。 - shehzy
4个回答

44
最新的Google Maps API现在包括折线点击监听器。您需要使用8.4或更高版本。在Gradle文件中:
compile 'com.google.android.gms:play-services-maps:8.4.0

设置地图折线监听器:

googleMap.setOnPolylineClickListener(new GoogleMap.OnPolylineClickListener() 
{
    @Override
    public void onPolylineClick(Polyline polyline)
    {
        //do something with polyline
    }
});

为了使监听器起作用,折线必须可点击。

PolylineOptions line = new PolylineOptions();
//add path points, set colour, etc. here
Polyline polyline = googleMap.addPolyline(line);
polyline.setClickable(true);

1
这是最好的解决方案+1。我忘记了设置setClickable。 - Corbella
1
@S.K,如果有多条路线,在用户点击特定的折线时,我想要更改路线(折线)的红色颜色,并将其显示在顶部(类似于z-Index),而其他路线(折线)则为灰色,位于被点击的折线旁边。 - Hiren Dabhi
1
所以,使用这个解决方案时,有时候点击可以正常工作,但有时会询问我是否要在Google地图中打开该点。对此有什么建议吗? - Brett Beatty

12

上述解决方案不正确。特别是当折线段的两个点之间距离较大时。

我回答了这个问题:Clickable Polylines Google Maps API Android

我们可以将上面的代码修改为:

mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng clickCoords) {
        for (PolylineOptions polyline : mPolylines) {
            if (PolyUtil.isLocationOnPath(clickCoords, polyline.getPoints(), true, 100)) {
                // user clicked on polyline
            }
        }
    }
});

9
很遗憾,没有折线点击监听器,所以您需要监听地图上的点击事件并检查是否在任何折线上注册了点击。您还需要保存对添加到地图上的折线的引用。
这是一个示例,计算点击位置是否距离折线约100米。
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
    @Override
    public void onMapClick(LatLng clickCoords) {
        for (PolylineOptions polyline : mPolylines) {
            for (LatLng polyCoords : polyline.getPoints()) {
                float[] results = new float[1];
                Location.distanceBetween(clickCoords.latitude, clickCoords.longitude,
                        polyCoords.latitude, polyCoords.longitude, results);

                if (results[0] < 100) {
                    // If distance is less than 100 meters, this is your polyline
                    Log.e(TAG, "Found @ "+clickCoords.latitude+" "+clickCoords.longitude);
                }
            }
        }
    }
});

一旦找到折线,您可以将该距离保存为float minDistance;,然后循环遍历其他折线以检查是否存在更接近的折线。

为了使其更加精确,您可以在每次触摸时获取缩放级别,并乘以所需距离。如100 * (22 - mMap.getCameraPosition().zoom)(您需要在较低的缩放级别下使用更大的距离)。

祝您好运!


0

Jetpack Compose的答案

使用Jetpack Compose非常简单,您只需要添加两个元素onclickclickable=true即可。请查看下面的示例:

Polyline(
    waypoints,
    color = Color.Black,
    width = 25f,
    geodesic = true,
    clickable = true,
    onClick = {
        Log.d("wowow", "clicked polyline")
    }
)

谷歌地图组件库:
implementation "com.google.maps.android:maps-compose:2.8.0"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接