Я долго искал четкую информацию о правильном способе расширения ItemizedOverlay и OverlayItem, но полученный результат меня пока не удовлетворяет. В двух словах, мне нужно показать на карте различные маркеры, относящиеся к ряду локаций; тип отображаемого маркера определяется конкретными свойствами самого местоположения. Мне также нужно будет отображать определенный маркер, когда маркер выбран, и другой, когда маркер не выбран или не сфокусирован. Насколько я понимаю, я написал следующее:
public class MyItemizedOverlay extends ItemizedOverlay<MyOverlayItem> {
ArrayList<MyOverlayItem> items;
//...
public MyItemizedOverlay(Drawable drawable, /*...*/) {
super(boundCenterBottom(drawable));
//...
populate();
}
public void addOverlay(MyOverlayItem overlay) {
return this.items.add(overlay);
populate();
@Override
protected MyOverlayItem createItem(int index) {
return this.items.get(index);
}
@Override
public int size() {
return this.items.size();
}}
public class MyOverlayItem extends OverlayItem {
//...
public Drawable getMarker(int stateBitset) {
Drawable drawable;
try {
if (stateBitset == 0) {
if (this.property.Equals("ON")) {
drawable = this.context.getResources().getDrawable(R.drawable.on);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
return drawable;
} else if (this.property.Equals("OFF")) {
drawable = this.context.getResources().getDrawable(R.drawable.off);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
return drawable;
} else {
drawable = this.context.getResources().getDrawable(R.drawable.generic);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
return drawable;
}
} else {
//same thing as above, just with different drawables.
}
} catch (Exception e) {
//...
}
return null;
}
MyItemizedOverlay создается и заполняется MyOverlayItem в основной MapActivity. Теперь: правильно размещены только маркеры по умолчанию. То есть те, у которых в качестве доступных для рисования тот, который был передан конструктору MyItemizedOverlay, и установлен с помощью boundCenterBottom (который устанавливает среднюю нижнюю точку изображения так, чтобы она указывала на указанную точку на карте). Когда метод getMarker в классе MyOverlayItem не возвращает null, а используется другой маркер, изображение отображается неправильно (например, тень не следует за изображением!). В методе getMarker вы должны определить ограничивающую рамку для рисования (с помощью drawable.setBounds); но я думаю, что таким образом, однако, вы не указываете, какой должна быть точка, которая должна быть помещена в точку карты.
Таким образом, возникает вопрос: как я могу указать для маркерного объекта, возвращаемого из метода getMarker объекта OverlayItem в ItemizedOverlay, границы, которые будут использоваться для размещения на карте (как это делается сboundCenterBottom в MyItemizedOverlay для объекта по умолчанию )? И как лучше всего это сделать?
;)