Как обнаружить клик на полилинии

Если на карте есть полилиния и клик выполняется на карте, то как я могу проверить, был ли этот клик на полилинии или где-то еще?

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() {          

    }
});

Ответ 1

К сожалению, нет такой вещи, как прослушиватель кликов для полилинии, поэтому вам придется прислушиваться к кликам на карте и проверять, был ли клик зарегистрирован на любой из ваших полилиний. Вам также нужно будет сохранить ссылки на полилинии, которые вы добавили на свою карту.

Вот пример, который вычисляет, существует ли полилиния в 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) (вам нужно использовать большее расстояние при более низких уровнях масштабирования).

Удачи!

Ответ 2

Самый последний API Карт Google теперь включает в себя прослушиватели кликов полилиний. Вы должны использовать 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);

Ответ 3

Решение выше не работает правильно. Особенно, если мы имеем большое расстояние между двумя точками полилинии.

Я ответил на этот вопрос: Clickable Polylines API Google Maps API

Мы можем изменить код выше:

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