Главная » Разработка для Android » Знакомство с MyLocationOverlay

0

Класс MyLocationOverlay — специальный вид Наложения, спроектиро- ванный для того, чтобы показывать  ваше текущее местоположение и ори- ентацию на объекте MapView.

Чтобы применить  MyLocationOverlay, требуется  создать новый экзем- пляр, передав ему в качестве параметров объект Context приложения и эле- мент MapView, и добавить его в список Наложений в MapView, как показано далее:

List<Overlay> overlays =

mapView.getOverlays(); MyLocationOverlay myLocationOverlay =

new MyLocationOverlay(this, mapView);

overlays.add(myLocationOverlay);

Вы можете использовать MyLocationOverlay для отображения текущих местоположения (в виде синей мигающей отметки) и ориентации  (в виде компаса на карте).

В следующем фрагменте показано, каким образом можно включить отображение  и компаса, и отметки.  В данном примере  в виде параметра передается  MapController, принадлежащий объекту MapView,  что позво- ляет Наложению автоматически прокручивать карту, если отметка выходит за пределы экрана.

myLocationOverlay.enableCompass();

myLocationOverlay.enableMyLocation(mapView.getMapController());

Знакомство с Детализированными наложениями и с объектом OverlayItem

Объекты OverlayItem нужны, чтобы обеспечить простую функциональ- ность вашему объекту MapView с помощью класса ItemizedOverlay.

Класс ItemizedOverlay предоставляет удобные и быстрые вызовы для добавления  отметок  на карту, позволяет  задавать  для них изображения и привязывать текст к конкретной  географической позиции.  Экземпляр ItemizedOverlay контролирует отрисовку, размещение, обработку на- жатий,  фокусировку и оптимизацию слоев для каждой  отметки  класса OverlayItem.

Чтобы добавить слой с отметками ItemizedOverlay на вашу карту, начни- те с создания нового класса, наследующего ItemizedOverlay<OverlayItem>, как показано в листинге 8.12.

ПРИМЕЧАНИЕ

ItemizedOverlay — обобщенный класс, помогающий создавать потомков, основанных на любом производном от OverlayItem классе.

Для начала необходимо вызвать конструктор родительского класса, определив  границы для вашей отметки по умолчанию. Затем нужно обра- титься  к методу populate  для инициирования создания  каждого элемента OverlayItem. Этот метод должен вызываться всякий раз, когда используемые данные меняются.

Внутри  реализации класса MyItemizedOverlay переопределите метод size. Он должен  возвращать  количество  отметок  для вывода  на экран. Переопределите также метод createItem, чтобы создавать новые элементы, основываясь на индексе каждой отметки.

Листинг 8.12. Создание нового Детализированного наложения

import android.graphics.drawable.Drawable;

import com.google.android.maps.GeoPoint;

import com.google.android.maps.ItemizedOverlay;

import com.google.android.maps.OverlayItem;

public class MyItemizedOverlay extends ItemizedOverlay<OverlayItem> {

public MyItemizedOverlay(Drawable defaultMarker) { super(boundCenterBottom(defaultMarker)); populate();

}

@Override

protected OverlayItem createItem(int index) {

switch (index) {

case 1:

Double lat = 37.422006*1E6; Double lng = -122.084095*1E6;

GeoPoint point = new GeoPoint(lat.intValue(), lng.intValue());

OverlayItem oi;

oi = new OverlayItem(point, "Marker", "Marker Text");

return oi;

}

return null;

}

@Override

public int size() {

// Верните количество отметок в коллекции return 1;

}

}

Чтобы добавить реализацию ItemizedOverlay на вашу карту, выполните новый экземпляр этого класса (передав  ему Drawable  для использования в каждой  отметке)  и добавьте его в список  Наложений, принадлежащий MapView.

List<Overlay> overlays = mapView.getOverlays(); MyItemizedOverlay markers = new

MyItemizedOverlay(r.getDrawable(R.drawable.marker));

overlays.add(markers);

ВНИМАНИЕ

Метки на карте, размещенные с помощью Детализированного наложе- ния, используют механизм состояний для уведомления о том, выбраны ли они. Задействуйте объект StateListDrawable, описанный в главе 4, чтобы сигнализировать о выборе метки.

В листинге 8.12 список элементов Наложения статичен и прописан в коде. На деле элементы вашего Наложения будут храниться в динамическом спи- ске ArrayList, куда вы сможете добавлять элементы, а также удалять их во время выполнения программы.

В листинге  8.13 показан  каркас  класса для динамической реализации ItemizedOverlay, использующий ArrayList  и поддерживающий добавление и удаление элементов во время выполнения программы.

Листинг 8.13. Каркас для динамического Детализированного наложения

public class MyDynamicItemizedOverlay extends

ItemizedOverlay<OverlayItem> {

private ArrayList<OverlayItem> items;

public MyDynamicItemizedOverlay(Drawable defaultMarker) {

super(boundCenterBottom(defaultMarker)); items = new ArrayList<OverlayItem>(); populate();

}

public void addNewItem(GeoPoint location, String markerText, String snippet) {

items.add(new OverlayItem(location, markerText, snippet));

populate();

}

public void removeItem(int index) {

items.remove(index);

populate();

}

@Override

protected OverlayItem createItem(int index) {

return items.get(index);

}

@Override

public int size() {

return items.size();

}

}

Источник: Майер P. Android 2 : программирование приложений для планшетных компьютеров и смартфонов : [пер. с англ. ] / Рето Майер. — М. : Эксмо, 2011. — 672 с. — (Мировой компьютерный бестселлер).

По теме:

  • Комментарии