Я долго искал четкую информацию о правильном пути расширения ItemizedOverlay и OverlayItem, но результат, который я получаю, еще не удовлетворяет меня. В нескольких словах мне нужно показать на карте разные маркеры, связанные с рядом мест; тип отображаемого маркера определяется конкретными свойствами самого местоположения. Мне также нужно будет отобразить определенный маркер при выборе маркера, а другой - когда маркер не выбран или не сфокусирован. Согласно тому, что я понимаю, это то, что я писал:GoogleMaps: пользовательский 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 (с drawable.setBounds); но я думаю, что таким образом, однако, вы не указываете, какой должна быть точка, которая должна быть помещена в точку карты.
Таким образом, возникает вопрос: как я могу указать, для возвращаемого маркера, возвращаемого методом getMarker объекта OverlayItem, в ItemizedOverlay, границы, которые будут использоваться для размещения на карте (как это делается с boundCenterBottom в MyItemizedOverlay для выбранного по умолчанию)? И что это лучший способ сделать это?
;)