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