6

我想点击谷歌地图 v2 安卓地图上的一个点。如果单击的点与折线路径上的某个点相交,则显示该折线。我没有看到任何记录在案的 android 中折线的可点击事件。我试图扩展当前的折线对象(标记为最终)

我还有什么其他选择?

4

5 回答 5

15

您可以使用库: https ://github.com/googlemaps/android-maps-utils

并使用下一个方法(在 OnMapClickListener 中)检测对折线的点击:

  PolyUtil.isLocationOnPath(point, polyline.getPoints(), isGeodesic, tolerance);
于 2014-11-26T23:00:19.873 回答
13

随着地图 API 的最新更新,v8.4 引入了可点击 Polyline

文档中所述:

使用OnPolylineClickListener监听可点击折线上的点击事件。要在地图上设置此侦听器,请调用 googleMap.setOnPolylineClickListener(...)。当用户点击折线时,您将收到 onPolylineClick(Polyline)回调。

梯度依赖:

compile 'com.google.android.gms:play-services-maps:8.4.0'

实现回调GoogleMap.OnPolylineClickListener

初始化折线:

Polyline polyline = googleMap.addPolyline(options);
polyline.setClickable(true);
...

接收事件

@Override
public void onPolylineClick(Polyline polyline) {
     ....
}

快乐编码:)

于 2016-01-27T10:59:33.303 回答
2

注册一个OnMapClickListener. 自己确定给定的点击是否在您的线路上。如果是,请在这种情况下做任何你想做的事情。

于 2013-01-19T16:44:42.933 回答
2

我有一个类似的问题,我无法处理折线上的点击事件。我使用的是 Xamarin for Android,它是 C#,但在这种情况下,功能与 Android Java 库基本相同。

最后,我最终做了似乎是唯一的选择。

这涉及处理我的折线的所有中点(其中大约有 1300 个)。每一次OnMapClick,我都采用LatLng了点击事件,并在它与静态中所有折线的中点之间执行了一个距离公式List<PolylineOptions>。然后我将地图标记附加到最近的折线。

从多段线上点击,它会在大约四分之一秒内弹出一个标记。

我想 Google Maps API 中实现的标记点击事件以类似的方式工作。

这是处理查找最接近点击点的 for 循环。

int i = 0;//create an indexer for the loop
double shortestDist = 100;//set an initial very large dist just to be safe
int myIndex = 0;//set variable that will store the running index of the closest point
foreach (PolylineOptions po in myPolylines) {
    var thisDist = Distance (point, midPoint (po.Points [0].Latitude, po.Points [0].Longitude, po.Points [1].Latitude, po.Points [1].Longitude));//calculate distance between point and midpoint of polyline
    if (thisDist < shortestDist) {
        shortestDist = thisDist;//remember current shortest distance
        myIndex = i;//set closest polyline index to current loop iteration
    }
    i++;
} 

我知道这不是最漂亮的代码,但它可以完成工作。我在互联网上的任何地方都没有看到真正的答案,所以就在这里。通过预先计算中点并将它们存储在一个大小相等的列表中,然后不必在每次地图点击时调用每条折线的中点公式,它可能会变得更高效,但它已经非常快速地工作了。

编辑

顺便说一句,我在 Galaxy s3 上进行了测试,所以我认为它并不太低效。

于 2014-08-04T14:41:20.063 回答
0

如果您正在使用,com.google.android.gms:play-services-maps:8.4.0则它包括折线单击侦听器

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

PolylineOptions line = new PolylineOptions();
Polyline polyline = googleMap.addPolyline(line);
polyline.setClickable(true);
于 2017-08-21T09:30:38.317 回答