android Maps API v2 с пользовательскими маркерами


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

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

8 61

8 ответов:

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

возможным решением является создание растрового изображения на лету и прикрепление его к маркеру. т. е. создать холст, вставить растровое изображение маркера, нарисовать текст рядом с маркером. Это включает в себя некоторые болезненные вычисления (соответствующий размер холста с растровым изображением маркера и текст рядом друг с другом). К сожалению, в маркере нет метода 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 добавит соответствующие методы, чтобы мы могли сделать это легко. Черт, мне очень нравится новая карта поверните функцию в API V2.

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

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

}

спасибо Аруну Джорджу: добавить текст к изображению в android программно

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

взгляните на http://googlemaps.github.io/android-maps-utils/

Он:

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

тепловые карты-отображение большого количества точек в виде тепловой карты

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

Markers made using the library

очень главное это может быть изменен на любой thread так что обработка многих маркеров-это ветер

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

, чтобы отобразить информационное окно, не требуя от пользователя нажмите:

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

для предоставления пользовательского просмотр для InfoWindow

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

публичный статический интерфейс GoogleMap.InfoWindowAdapter

открывается вид на индивидуальный рендеринг инфо-окон.

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

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

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

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

настройка изображения маркера

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

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

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

fromFile (Путь к строке) Создает пользовательский значок из файла по указанному пути.

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

этот простой код работает для отображения заголовка, не требуя событие click:

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

почему бы тебе не сохранить массив маркеров тогда, когда дело доходит до laoding маркеры, перебирать их, называя showInfoWindow(). Может быть, это не самое элегантное решение, но оно делает то, что вы говорите, Я думаю.

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

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

an example marker that I made