可点击折线谷歌地图API Android

7
我想在Google地图v2的Android版上点击一个点。如果点击的点与折线路径上的某个点相交,则显示该折线路径。我没有看到任何关于Android中折线可点击事件的文档。我尝试扩展当前的Polyline对象(标记为final),但无法实现。还有其他什么选择吗?
5个回答

15

我可以不使用库来完成吗? - Sagar Patil

14

最近更新的地图API v8.4 引入了可点击 Polyline。根据文档所述:

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

gradle-dependency:

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) {
     ....
}

愉快的编码 :)


1
对我来说完美地工作了,感谢您提供的出色更新答案,它为我节省了数小时的工作时间。 - A.Alqadomi

2
我曾经遇到一个类似的问题,无法处理折线上的点击事件。我使用的是 Xamarin for Android,它是 C# 编写的,但在这种情况下其功能与 Android Java 库基本相同。
最终,我只能采取看起来唯一的选择。这涉及到处理我的所有折线的中点(大约有 1300 条)。在每次 OnMapClick 中,我获取点击事件的 LatLng,并对静态 List 中所有折线的中点进行距离计算。然后将地图标记附加到最近的折线上。
从点击折线开始,它会在约四分之一秒内弹出一个标记。
我想 Google Maps API 实现的标记点击事件也是以类似的方式工作的。
以下是处理查找最接近点击点的循环:
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上进行测试,所以我认为它不太低效。

2

注册OnMapClickListener。自己确定给定的点击是否在你的线上。如果是,就按照你想要的方式进行操作。


1
最终我使用了 dispatchTouchEvent。我需要使用地图的“swipes”来突出显示折线而不是单击。 - Wayne
@Wayne: 我对 dispatchTouchEvent() 能正常工作感到印象深刻。我原以为这可能会破坏地图的平移/缩放等功能。但是,是的,OnMapClickListener 只适用于简单的点击操作。 - CommonsWare
1
@Wayne,你能详细说明一下你是如何做到的吗? - Nighto
@eanix在他的回答中提到了一个可以用来检测点击是否在折线上的库。 - Caio Iglesias

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);

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