如何检测折线上的单击

时间:2014-08-08 07:13:32

标签: android google-maps 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() {          

    }
});

3 个答案:

答案 0 :(得分:38)

最新的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
    }
});

Polyline需要可点击以使侦听器工作。

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

答案 1 :(得分:10)

上述解决方案无法正常运行。特别是如果我们在折线的两个点之间有很大的距离。

我回答了这个问题: 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
            }
        }
    }
});

答案 2 :(得分: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)一样(你需要在较低的缩放级别使用更大的距离)。

祝你好运!