GoogleMaps: пользовательские ItemizedOverlay и OverlayItem, правильный способ отображения разных маркеров

Я долго искал четкую информацию о правильном способе расширения 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 для объекта по умолчанию )? И как лучше всего это сделать?

;)


person e-cal    schedule 30.05.2011    source источник


Ответы (1)


Хорошо, после повторных тестов кажется, что это:

drawable.setBounds(-drawable.getIntrinsicWidth()/2, -drawable.getIntrinsicHeight(), drawable.getIntrinsicWidth() /2, 0);

помещенный в метод getMarker объекта OverlayItem для возвращаемого объекта рисования, выполняет задание (как это делаетboundBottomCenter в ItemizedOverlay). Теперь все работает нормально, и даже нестандартные маркеры отображаются корректно.

Ваше здоровье!

person e-cal    schedule 31.05.2011