GoogleMaps: пользовательские ItemizedOverlay и OverlayItem, правильный способ показать другой маркер - PullRequest
2 голосов
/ 30 мая 2011

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

;)

1 Ответ

12 голосов
/ 31 мая 2011

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

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

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

Ура!

...