Как нарисовать пунктирную линию с андроидом google map sdk v2?

Я просмотрел документацию по полилинии, и нет возможности сделать ее разбитой.

Кто-нибудь знает, как нарисовать пунктирную линию с андроидом google map sdk v2?

Алексей, я только что создал функцию, которая работала для меня, и я думаю, что это поможет вам:

public static void createDashedLine(GoogleMap map, LatLng latLngOrig, LatLng latLngDest, int color){ double difLat = latLngDest.latitude - latLngOrig.latitude; double difLng = latLngDest.longitude - latLngOrig.longitude; double zoom = map.getCameraPosition().zoom; double divLat = difLat / (zoom * 2); double divLng = difLng / (zoom * 2); LatLng tmpLatOri = latLngOrig; for(int i = 0; i < (zoom * 2); i++){ LatLng loopLatLng = tmpLatOri; if(i > 0){ loopLatLng = new LatLng(tmpLatOri.latitude + (divLat * 0.25f), tmpLatOri.longitude + (divLng * 0.25f)); } Polyline polyline = map.addPolyline(new PolylineOptions() .add(loopLatLng) .add(new LatLng(tmpLatOri.latitude + divLat, tmpLatOri.longitude + divLng)) .color(color) .width(5f)); tmpLatOri = new LatLng(tmpLatOri.latitude + divLat, tmpLatOri.longitude + divLng); } } 

Это невозможно в текущем выпуске. Следуйте этой проблеме для обновлений: https://code.google.com/p/gmaps-api-issues/issues/detail?id=4633

ОБНОВИТЬ

Недавно Google применил эту функцию для полилиний в Google Maps Android API v2 и отмечена проблема 4633 как исправлена.

См. Информацию об шаблонах штрихов в Руководстве по фигурам . См. Пример в учебнике «Полилинии и полигоны».

Вы также можете прочитать соответствующий блог:

https://maps-apis.googleblog.com/2017/02/styling-and-custom-data-for-polylines.html

Теперь в Polyline вы можете установить шаблон как Dash, Dot или Gap, просто примените следующее

 public static final int PATTERN_DASH_LENGTH_PX = 20; public static final int PATTERN_GAP_LENGTH_PX = 20; public static final PatternItem DOT = new Dot(); public static final PatternItem DASH = new Dash(PATTERN_DASH_LENGTH_PX); public static final PatternItem GAP = new Gap(PATTERN_GAP_LENGTH_PX); public static final List PATTERN_POLYGON_ALPHA = Arrays.asList(GAP, DASH); private void drawDashedLeg(GoogleMap googleMap, Route route) { PolylineOptions polyOptions = new PolylineOptions(); polyOptions.color(ContextCompat.getColor(getContext(), R.color.coolgrey)); polyOptions.addAll(route.getPoints()); polyOptions.pattern(PATTERN_POLYGON_ALPHA); Polyline polyline = googleMap.addPolyline(polyOptions); polylines.add(polyline); } 

Я создал следующую функцию для рисования пунктирной полилинии со списком точек LatLng. Этот алгоритм создает линии 0,002 км (с последующим разрывом 0,002 км) независимо от увеличения. Это полезно, когда вы не хотите перерисовывать полилинии при изменении масштаба.

 private void drawDashedPolyLine(GoogleMap mMap, ArrayList listOfPoints, int color) { /* Boolean to control drawing alternate lines */ boolean added = false; for (int i = 0; i < listOfPoints.size() - 1 ; i++) { /* Get distance between current and next point */ double distance = getConvertedDistance(listOfPoints.get(i),listOfPoints.get(i + 1)); /* If distance is less than 0.002 kms */ if (distance < 0.002) { if (!added) { mMap.addPolyline(new PolylineOptions() .add(listOfPoints.get(i)) .add(listOfPoints.get(i + 1)) .color(color)); added = true; } else {/* Skip this piece */ added = false; } } else { /* Get how many divisions to make of this line */ int countOfDivisions = (int) ((distance/0.002)); /* Get difference to add per lat/lng */ double latdiff = (listOfPoints.get(i+1).latitude - listOfPoints .get(i).latitude) / countOfDivisions; double lngdiff = (listOfPoints.get(i + 1).longitude - listOfPoints .get(i).longitude) / countOfDivisions; /* Last known indicates start point of polyline. Initialized to ith point */ LatLng lastKnowLatLng = new LatLng(listOfPoints.get(i).latitude, listOfPoints.get(i).longitude); for (int j = 0; j < countOfDivisions; j++) { /* Next point is point + diff */ LatLng nextLatLng = new LatLng(lastKnowLatLng.latitude + latdiff, lastKnowLatLng.longitude + lngdiff); if (!added) { mMap.addPolyline(new PolylineOptions() .add(lastKnowLatLng) .add(nextLatLng) .color(color)); added = true; } else { added = false; } lastKnowLatLng = nextLatLng; } } } } private double getConvertedDistance(LatLng latlng1, LatLng latlng2) { double distance = DistanceUtil.distance(latlng1.latitude, latlng1.longitude, latlng2.latitude, latlng2.longitude); BigDecimal bd = new BigDecimal(distance); BigDecimal res = bd.setScale(3, RoundingMode.DOWN); return res.doubleValue(); } 

Класс Util для вычисления расстояния между двумя LatLng:

 public class DistanceUtil { public static double distance(double lat1, double lon1, double lat2, double lon2) { if ((lat1 == lat2) && (lon1 == lon2)) { return 0; } else return distance(lat1, lon1, lat2, lon2, 'K'); } public static double distance(double lat1, double lon1, double lat2, double lon2, char unit) { double theta = lon1 - lon2; double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta)); dist = Math.acos(dist); dist = rad2deg(dist); dist = dist * 60 * 1.1515; if (unit == 'K') { dist = dist * 1.609344; } else if (unit == 'N') { dist = dist * 0.8684; } return (dist); } private static double deg2rad(double deg) { return (deg * Math.PI / 180.0); } private static double rad2deg(double rad) { return (rad * 180.0 / Math.PI); } } 

Примечание. Вышеупомянутый алгоритм генерирует очень большое количество полилиний, которые могут потребовать времени для рендеринга. Это полезно, только если список точек невелик.

  • Увеличение и уменьшение масштаба изображения в Android
  • Подсчет голосов в EditText Changed Listener
  • Как измерить высоту TextView на основе ширины и размера шрифта устройства?
  • android: определение уровня звука
  • Как найти имя контакта с номера телефона на Android?
  • GoogleService не удалось инициализировать
  • Как написать код для создания sharedpreferences для массива в android?
  • Как реализовать перетаскиваемую карту, например, uber android, Update with change location
  • Запуск Google Maps Directions через намерение Android
  • Отключить блокировку экрана
  • Кнопка удаления fragmentа кнопки Android Fragment
  • Давайте будем гением компьютера.