Personalizzato OverlayItem non disegno
-
27-09-2019 - |
Domanda
Ho creato una classe OverlayItem personalizzato in modo che potessi avere in sostanza un tipo di OverlayItem cui segnalino Drawable sarebbe porsi a seconda dello stato di alcuni dati che mi passa dentro.
Ho cercato di ottenere questo risultato, il mio primo tentativo, utilizzando il metodo setMarker
all'interno della classe OverlayItem. Una volta che non ha funzionato tento di eseguire l'override del metodo getMarker
e farlo ritornare l'indicatore appropriato per rappresentare i dati.
Entrambi questi tentativi conclusa con nulla in corso di elaborazione sulla mappa ... se queste sono commentate i marcatori disegnare bene (a meno che, naturalmente, usare il marcatore di default, che non è quello che voglio).
Ecco il mio codice per la mia classe OverlayItem personalizzato (i metodi commentate Ho provato e non hanno funzionato):
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);
}*/
}
C'è un modo per fare quello che sto cercando di fare ... o ho bisogno di fare una classe OverlayItem unico che corrisponde ad ogni stato dei miei dati? (Ew).
Soluzione
Sono stato in grado di far apparire i marcatori, tuttavia essi appaiono a testa in giù (almeno, penso che siano, potrebbe essere solo che la loro ombra è in alto a sinistra piuttosto che il basso a destra).
tutto quello che dovevo fare era aggiungere questa riga:
this.mMarker.setBounds(0, 0, this.mMarker.getIntrinsicWidth(), this.mMarker.getIntrinsicHeight());
... così come questa linea per orientare correttamente i marcatori (ho aggiunto questo quando il mio ItemizedOverlay aggiunge elemento di sovrapposizione tan:
overlay.setMarker(boundCenterBottom(overlay.getMarker(0)));
Altri suggerimenti
Gli stati API che l'indicatore ha bisogno limiti da visualizzare ...
@celestialorb O uno dei tuoi frammenti fa il lavoro da solo (o la mia ha lavorato con entrambi comunque) quando si utilizza setBounds () da solo, si ottiene ciò che si dice di fare ... il rettangolo di selezione per il marcatore è impostato. L'orientamento al di OverlayItem Point e l'ombra dello stato del marcatore, ecc sono impostati di default (non guardare quelli, ma non fanno quello che voglio ...):)
mOverlay.setMarker (boundCenterBottom (mOverlay.getMarker (0))); fa il lavoro completo per voi, impostare i limiti e centrare la parte inferiore del marcatore sul punto (da qui il nome di Metodo elegante).
Ora, per quanto riguarda le migliori pratiche, le lampadine più luminose di quanto dovrà carillon in ...
Prova l'override del metodo onDraw()
della classe overlay.
Ecco un altro approccio:
credo di preferire questa risposta se ... grazie!