2010-08-10 16 views
9

Creé una clase OverlayItem personalizada para poder tener esencialmente un tipo de elemento de superposición cuyo marcador Drawable se establecería en función del estado de algunos datos que pase a él.Custom OverlayItem no dibujo

He intentado lograr esto, en mi primer intento, utilizando el método setMarker dentro de la clase OverlayItem. Una vez que eso no funcionó, intento anular el método getMarker y hacer que devuelva el marcador apropiado para representar los datos.

Ambos intentos terminaron sin que se dibujara nada en el mapa ... sin embargo, si están comentados, los marcadores dibujan bien (excepto que por supuesto usan el marcador predeterminado, que no es lo que quiero).

Aquí está mi código para mi clase OverlayItem personalizado (los métodos comentados fuera, me han intentado y no han trabajado):

private class MyOverlayItem extends OverlayItem { 
    private Context mContext; 
    private MyData mData; 

    public MyOverlayItem(GeoPoint point, MyData data, Context context) { 
     super(point, data.getWhat(), data.getWhere()); 
     this.mContext = context; 
     this.mData = data; 

     /*if(data.getTemp() > 200) 
      this.setMarker(res.getDrawable(R.drawable.icon_data_hot_l)); 
     else if(data.getTemp() > 100) 
      this.setMarker(res.getDrawable(R.drawable.icon_data_neutral_l)); 
     else 
      this.setMarker(res.getDrawable(R.drawable.icon_data_frozen_l));*/ 
    } 

    /*@Override 
    public Drawable getMarker(int stateBitset) { 
     Resources res = this.mContext.getResources(); 
     if(this.mData.getTemp() > 200) 
      return res.getDrawable(R.drawable.icon_data_hot_l); 
     else if(this.mData.getTemp() > 100) 
      return res.getDrawable(R.drawable.icon_data_neutral_l); 
     return res.getDrawable(R.drawable.icon_data_frozen_l); 
    }*/ 
} 

¿Hay una manera de hacer lo que estoy tratando de hacer ... ¿o necesito crear una clase OverlayItem única que corresponda a cada estado de mis datos? (Ew.)

Respuesta

4

He podido hacer que aparezcan los marcadores, sin embargo, aparecen al revés (al menos, creo que sí, puede ser que su sombra esté en la parte superior izquierda en vez de en la parte inferior derecha) .

Todo lo que tenía que hacer era añadir esta línea:

this.mMarker.setBounds(0, 0, this.mMarker.getIntrinsicWidth(), this.mMarker.getIntrinsicHeight()); 

... además de esta línea para orientar correctamente los marcadores (añadí esto cuando mi ItemizedOverlay añade bronceado elemento de superposición:

overlay.setMarker(boundCenterBottom(overlay.getMarker(0))); 
1

Intente anular el método onDraw() de su clase de superposición.

+1

¿Te refieres al método draw (...)? Parece como si fuera demasiado complicado y demasiado provisional. La documentación indica que, "Un elemento puede proporcionar un marcador alternativo a través de su método OverlayItem.getMarker (int). Si ese método devuelve nulo, se utiliza el marcador predeterminado," por lo que no debería ser capaz de anular el método getMarker y hacer que dibuje los diferentes marcadores? – celestialorb

2

los estados de la API que necesita el marcador de límites que se mostrará ...

@celestialorb cualquiera de sus fragmentos se encarga del trabajo en solitario (o la mía trabajó con cualquiera de todos modos) cuando usa setBounds() solo, obtiene lo que le dice que haga ... se establece el cuadro delimitador para su marcador. La orientación del punto de OverlayItem y el estado de la sombra del marcador, etc. están configurados por defecto (no los busqué, pero no hacen lo que quiero ...) :)

mOverlay.setMarker (boundCenterBottom (mOverlay.getMarker (0))); hace el trabajo completo para usted, estableciendo los límites y centrando la parte inferior del Marcador en el Punto (de ahí el nombre elegante del Método).

Ahora, en cuanto a las mejores prácticas, las bombillas más brillante que voy a tener que meter su cuchara ...