Android google maps: создаем infowindow любой формы

в 12:45, , рубрики: android, google maps api v2, Программирование, Разработка под android, метки: , ,

Android google maps: создаем infowindow любой формы
Недавно мне понадобилось сделать infowindow для карт google, в котором бэкграунд задавался картинкой, соответственно форма тоже. Сначала я подумал, что придется использовать какие-либо сторонние библиотеки, но делать это не совсем хотелось, поэтому я решил попробовать выполнить задачу стандартными средствами. Как оказалось решается она довольно просто.

Стиль

Для начала явно зададим стиль нашего окошка(если честно, то при использовании стиля Theme.Light, не расширяя его, мы добьемся такого же эффекта, но кто знает будет ли это работать корректно везде и всегда, поэтому лучше указать параметры явно). Для этого добавим в values/styles следующий стиль:

    <style name="TransparentBackground" parent="android:Theme.Light">
        <item name="android:windowIsTranslucent">true</item> <!-- подлупрозрачность окна -->
        <item name="android:windowBackground">@android:color/transparent</item> <!-- прозрачный цвет бэкграунда -->
        <item name="android:windowContentOverlay">@null</item> <!-- отключаем оверлей содержимого окна -->
        <item name="android:windowNoTitle">true</item> <!-- отключаем заголовок -->
        <item name="android:windowIsFloating">true</item> <!-- окно в любой части экрана -->
        <item name="android:backgroundDimEnabled">false</item> <!-- отключаем затемнение -->
    </style>

Бэкграунд

Теперь нам нужна картинка для бэкграунда, к примеру я взял «нагугленную» зведу(проверяем в Paint.NET наличие прозрачности):

Android google maps: создаем infowindow любой формы

Отлично, теперь помещаем star.png в папку res/drawable нашего проекта.

Описание непосредственно infowindow

Сперва опишем лэйаут нашего окошка, для чего создадим файл custom_infowindow.xml, в папке res/layout, ниже его содержимое:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <ImageView
        android:layout_height="162dp"
        android:layout_width="150dp"
        android:layout_marginLeft="15dp"
        android:src="@drawable/star" />

    <TextView
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_marginTop="80dp"
        android:layout_marginLeft="51dp"
        android:textSize="12sp"
        android:text="@string/hello_world" />

</RelativeLayout>

В лэйауте мы располагаем картинку как ImageView. В качестве примера информации в infowindow задаем так же TextView с текстом «Hello world!». Отступы используются для выравнивания отображения элементов лейаута так, как нам надо. Кроме того если в серединке звезда была бы залита цветом, текст будет отображаться поверх картинки, из-за порядка описания. Например:

Android google maps: создаем infowindow любой формы

Отрисовываем наш лейаут

Теперь определим InfoWindowAdapter:

    @Override
    public View getInfoWindow(Marker marker) {

        ContextThemeWrapper wrapper = new ContextThemeWrapper(getApplicationContext(), R.style.TransparentBackground);
        LayoutInflater inflater = (LayoutInflater) wrapper.getSystemService(LAYOUT_INFLATER_SERVICE);
        View layout = inflater.inflate(R.layout.custom_infowindow, null);
        return layout;

    }

    @Override
    public View getInfoContents(Marker marker) {
        return null;
    }

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

Дело за малым

В принципе все, теперь задаем адаптер к нашей GoogleMap методом setInfoWindowAdapter(...), и любуемся результатом =).

Автор: doubledeath

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js