How to detect a click on a polyline How to detect a click on a polyline android android

How to detect a click on a polyline


The most recent Google Maps API now includes polylines click listener. You need to be using 8.4+. In gradle file:

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

Setup map polyline listener:

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

Polyline needs to be clickable for the listener to work.

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


The solution above doesn't work correctly. Especially if we have large distance between two points of polyline.

I answered this question:Clickable Polylines Google Maps API Android

We can modify code above like this:

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


Unfortunately there's no such thing as a polyline click listener so you'll have to listen to clicks on map and check if a click was registered on any of your polylines. You'll also have to save references to the polylines you added to your map.

Here's an example that calculates if there's a polyline ~100meters away from the click.

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

Once a polyline is found you can save that distance as float minDistance; and then loop through other polylines to check if there is a closer one.

To make this more precise you can get the zoom level at each touch and multiply your required distance. Like 100 * (22 - mMap.getCameraPosition().zoom) (you need to use bigger distance at lower zoom levels).

Good luck!