2011-05-30 3 views
2

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

;)

ответ

12

Ok, после повторных испытаний, кажется, что это:

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

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

Cheers!