Intereting Posts
Активность Android-карты падает при выходе из Activity Facebook SDK + SlidingMenu SDK = несоответствие Jar! Исправьте свои зависимости Пример Android RSS Макс. Дата на Android DatePickerDialog Отображение изображения, большего, чем экран устройства Фоновый процесс Проверка местоположения пользователя через регулярные промежутки времени и обновление локальной базы данных, даже если приложение не открыто Файлы Android .xml: почему предопределенные цвета не работают для меня? Android: используйте значок в качестве кнопки «Назад», не перезагружая предыдущую активность. Цветовой код указателя курсора EditText для Android Как фильтровать протоколирование (используя LOCAL_LOGV) Добавление эффекта пульсации для просмотра в onClick Какова цель установки минимального размера кучи в приложении Android? Анимирование окна Android вместе с представлением Изменение фонового цвета виджета приложения Скрыть уведомление об обслуживании переднего плана, пока активность видна

API Android Android v2 с настраиваемыми маркерами

Я хочу создавать карты с пользовательскими маркерами. В API v2 я могу установить значок, заголовок и т. Д. Для маркеров. Но я хочу отображать заголовок с маркером при первом начале. Теперь заголовок отображается только при наклеивании маркера. В v1 были наложения, но в v2 я не нашел ничего подобного.

Отредактировано: Возможно, я был недостаточно ясен. Что-то вроде Marker.showInfoWindow() в API работает только для одного маркера. Я не могу одновременно показывать информационные окна для всех своих маркеров. В любом случае мне нужно показать названия для всех моих маркеров, не дожидаясь, пока пользователь коснется его.

Я также наткнулся на эту проблему. V2 API – шаг вперед, два шага назад. Google, добавьте метод «рисования» на класс Маркера или GoogleMap, чтобы мы могли самостоятельно настроить чертеж.

Возможным решением является создание растрового изображения на лету и прикрепление его к маркеру. Т.е. создать холст, вставить растровое изображение маркера, нарисовать текст рядом с маркером. Это связано с некоторыми болезненными вычислениями (соответствующий размер холста с растровым маркером и текст рядом друг с другом). К сожалению, в Marker нет метода setIcon, поэтому каждый раз, когда текст изменяется, необходимо создать новый маркер. Это может быть хорошо, если у вас есть только маркер на карте, но с десятками маркеров это может оказаться невыполнимым. Также может возникнуть проблема с памятью при создании этих растровых изображений динамически. Пример кода (только с текстом):

 Bitmap.Config conf = Bitmap.Config.ARGB_8888; Bitmap bmp = Bitmap.createBitmap(200, 50, conf); Canvas canvas = new Canvas(bmp); canvas.drawText("TEXT", 0, 50, paint); // paint defines the text color, stroke width, size mMap.addMarker(new MarkerOptions() .position(clickedPosition) //.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker2)) .icon(BitmapDescriptorFactory.fromBitmap(bmp)) .anchor(0.5f, 1) ); 

Надеюсь, Google добавит соответствующие методы, чтобы мы могли сделать это легко. Черт, мне очень нравится новая функция поворота карты в V2 API.

Наконец сделал это. Так что у вас есть фоновое изображение (в моем случае я просто использую синий прямоугольник). Создайте маркер следующим образом:

 Marker myLocMarker = map.addMarker(new MarkerOptions() .position(myLocation) .icon(BitmapDescriptorFactory.fromBitmap(writeTextOnDrawable(R.drawable.bluebox, "your text goes here")))); 

Обратите внимание на метод writeTextOnDrawable ():

 private Bitmap writeTextOnDrawable(int drawableId, String text) { Bitmap bm = BitmapFactory.decodeResource(getResources(), drawableId) .copy(Bitmap.Config.ARGB_8888, true); Typeface tf = Typeface.create("Helvetica", Typeface.BOLD); Paint paint = new Paint(); paint.setStyle(Style.FILL); paint.setColor(Color.WHITE); paint.setTypeface(tf); paint.setTextAlign(Align.CENTER); paint.setTextSize(convertToPixels(context, 11)); Rect textRect = new Rect(); paint.getTextBounds(text, 0, text.length(), textRect); Canvas canvas = new Canvas(bm); //If the text is bigger than the canvas , reduce the font size if(textRect.width() >= (canvas.getWidth() - 4)) //the padding on either sides is considered as 4, so as to appropriately fit in the text paint.setTextSize(convertToPixels(context, 7)); //Scaling needs to be used for different dpi's //Calculate the positions int xPos = (canvas.getWidth() / 2) - 2; //-2 is for regulating the x position offset //"- ((paint.descent() + paint.ascent()) / 2)" is the distance from the baseline to the center. int yPos = (int) ((canvas.getHeight() / 2) - ((paint.descent() + paint.ascent()) / 2)) ; canvas.drawText(text, xPos, yPos, paint); return bm; } public static int convertToPixels(Context context, int nDP) { final float conversionScale = context.getResources().getDisplayMetrics().density; return (int) ((nDP * conversionScale) + 0.5f) ; } 

Благодаря Arun George: Добавить текст в картинке в android программно

Похоже, на ваш вопрос был наконец ответ на сеанс ввода-вывода Google.

Посмотрите http://googlemaps.github.io/android-maps-utils/

В нем есть:

Кластерная кластеризация – обрабатывает отображение большого количества точек

Карты тепла – отображать большое количество точек в виде карты тепла

IconGenerator – отображает текст на маркерах (см. Скриншот)

Маркеры, созданные с помощью библиотеки

Очень важно, что он может быть изменен на любой нити, поэтому обработка многих маркеров – это бриз

Я не уверен, чего вы пытаетесь достичь: наличие информационного окна, без которого пользователь должен нажать маркер, или использовать совершенно другое представление для информационного окна (или, возможно, и того и другого).

Чтобы отобразить информационное окно без запроса пользователя:

Я не тестировал это сам, но я предполагаю, что Marker.showInfoWindow () выполнит трюк (предполагая, что видимость маркера уже true .

Чтобы создать пользовательский вид InfoWindow

Здесь есть два варианта, и вы должны обратиться к документации по GoogleMap.InfoWindowAdapter :

Открытый статический интерфейс GoogleMap.InfoWindowAdapter

Предоставляет представления для персонализированного рендеринга инфо-окон.

Методы этого провайдера вызывают, когда настало время показать информационное окно для маркера независимо от причины (либо жест пользователя, либо программный вызов showInfoWindow (). Поскольку в одно время отображается только одно информационное окно, Этот поставщик может выбрать повторное использование представлений или может выбрать создание новых представлений при каждом вызове метода.

При построении информационного окна методы в этом классе вызывают в определенном порядке. Чтобы заменить информационное окно по умолчанию, переопределите getInfoWindow (Marker) с помощью настраиваемого рендеринга. Чтобы заменить только содержимое информационного окна, внутри фрейма инфо-окна по умолчанию (пузырь выноски) оставьте стандартную реализацию getInfoWindow (Marker) на месте и вместо этого замените getInfoContents (Marker).

В принципе, независимо от того, переопределяете ли вы getInfoWindow() или getInfoContents() , зависит ли вы просто от необходимости настраивать то, что вы видите внутри пузырька выноски, или хотите ли вы настроить представление всего информационного окна, в том числе альтернативу пузырю вызова ,

Одно предостережение: я верю, что когда вы переопределяете эти методы, он выполняет простой рендеринг того, как выглядит представление в то время, когда getInfoWindow() или getInfoContents() . Я сам заинтересован в попытке воспроизвести внешний вид родного приложения Google Maps для Android, у которого есть маленький значок «направлений» рядом с названием места. Одна из проблем, которые я считаю (см. Здесь: https://stackoverflow.com/a/13713536/129475 ), заключается в том, что если у вас есть что-то вроде кнопки в вашем представлении, она может не вести себя как кнопка из-за статического рендеринга.

Настроить изображение маркера

Вы можете заменить изображение маркера по умолчанию на пользовательское изображение маркера, которое часто называют значком. Пользовательские значки всегда задаются как BitmapDescriptor и определяются с использованием одного из четырех методов в классе BitmapDescriptorFactory.

FromAsset (String assetName) Создает пользовательский маркер, используя изображение в каталоге активов.

FromBitmap (растровое изображение) Создает пользовательский маркер из растрового изображения.

FromFile (String path) Создает пользовательский значок из файла по указанному пути.

FromResource (int resourceId) Создает пользовательский маркер с использованием существующего ресурса. В приведенном ниже фрагменте создается маркер с пользовательским значком.

  private static final LatLng MELBOURNE = new LatLng(-37.813, 144.962); private Marker melbourne = mMap.addMarker(new MarkerOptions() .position(MELBOURNE) .title("Melbourne") .snippet("Population: 4,137,400") .icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow))); 

Этот простой код работает, чтобы отобразить заголовок, не требуя события щелчка:

 googleMap.addMarker(new MarkerOptions() .position(latLng) .title(String title)) .showInfoWindow(); 

Почему бы вам не сохранить массив маркеров тогда, когда дело доходит до лайрования маркеров, итерации через них, вызывающие showInfoWindow() . Не может быть самым элегантным решением, но он делает то, что вы говорите, я думаю.

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

Я использовал Photoshop и метки 53x110px.

Примерный маркер, который я сделал