2013-04-16 8 views
6

Sto convertendo una vecchia applicazione da v1 a v2 e sto riscontrando un problema con il colore delle icone dell'indicatore. Ho un'icona bianca di base e deve essere colorata.Conversione di un drawable in bitmap per modificare il colore di un marker nell'API Android di Google Maps v2

In v1, l'ho fatto in questo modo:

Drawable d = DrawableUtils.resizeImageToDrawable(
    MapViewFragment.mapviewActivity, 
    Configuration.Display.getDrawableFix(i), 
    Configuration.MapView.getWaypointIconWidth(), 
    Configuration.MapView.getWaypointIconHeight()); 
d.setColorFilter(color, Mode.MULTIPLY); 

overlay = new MyFplnFixListItimizedOverlay(d); 

Dal Marcatori v2 non accettano drawable per le loro icone, ho pensato di convertire il Drawable a una bitmap, come questo:

Drawable d = DrawableUtils.resizeImageToDrawable(
    MapViewFragment.mapviewActivity, 
    Configuration.Display.getDrawableFix(i), 
    Configuration.MapView.getWaypointIconWidth(), 
    Configuration.MapView.getWaypointIconHeight()); 
d.setColorFilter(color, Mode.MULTIPLY); 

Bitmap icon = ((BitmapDrawable) d).getBitmap(); 

Marker marker = MapViewFragment.map.addMarker(new MarkerOptions() 
    .position(point) 
    .title(Integer.toString(fplnType)) 
    .visible(true) 
    .icon(BitmapDescriptorFactory.fromBitmap(icon))); 

Ma per qualche motivo, non funziona. Le icone rimangono bianche. Qualcuno sa perché?

Grazie in anticipo.

risposta

6

OK, ecco come ho fatto alla fine della giornata:

Drawable d = DrawableUtils.resizeImageToDrawable(
        MapViewFragment.mapViewActivity, 
        Configuration.Display.getDrawableFix(i), 
        Configuration.MapView.getWaypointIconWidth(), 
        Configuration.MapView.getWaypointIconHeight()); 
d.setColorFilter(color, Mode.MULTIPLY); 

Bitmap b = ((BitmapDrawable) d).getBitmap(); 
Canvas myCanvas = new Canvas(b); 

int myColor = b.getPixel(0,0); 
ColorFilter filter = new LightingColorFilter(myColor, color); 

Paint pnt = new Paint(); 
pnt.setColorFilter(filter); 
myCanvas.drawBitmap(b,0,0,pnt); 

Marker marker = MapViewFragment.map.addMarker(new MarkerOptions() 
    .position(point) 
    .title(Integer.toString(fplnType)) 
    .visible(true) 
    .icon(BitmapDescriptorFactory.fromBitmap(b))); 
+1

Grazie per aver condiviso. Hai dovuto gestire OutOfMemoryExceptions? – sealskej

0

Non sono sicuro di cosa stia facendo DrawableUtils, ma lo si sta convertendo in BitmapDrawable. È davvero un BitmapDrawable?

ecco qualche codice per estrarre una bitmap fuori da ogni tipo di drawable:

Drawable d = // make sure it's not null 
d.setBounds(0, 0, width, height); 
Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
Canvas c = new Canvas(b); 
d.draw(c); 

l'idea è che si crea una tela su una bitmap mutevole e disegnare che disegnabile sulla tela

modifica :

Ho appena visto la risposta @Analizer e sì, la mia risposta è buona se non si dispone del Drawable come risorsa. Ma se lo fai, usa invece la sua risposta.

+0

non sto gettando DrawableUtils ad un Drawable, sto solo usando per ridimensionare il drawable ad una certa dimensione. Inoltre, grazie per il tuo consiglio, ma sono confuso su cosa dovrei mettere per "display" e "config". – Apoz

+0

scusate, avrei dovuto spiegare un po 'di più, e anche c'è stato un errore (controllare il codice aggiornato). La configurazione può essere una delle opzioni da qui: https://developer.android.com/reference/android/graphics/Bitmap.Config.html e il display le opzioni da qui https://developer.android.com/reference /android/util/DisplayMetrics.html Sul display puoi ottenere le metriche del display e penso che sia già pre-scalare la Bitmap sul display, ma dovrai testarlo per te stesso, in quanto è solo una mia ipotesi. Ma come puoi vedere nella modifica, puoi semplicemente costruire senza display. – Budius

+0

Ma cosa dovrei fare dopo? Dovrei usare direttamente la bitmap come icona per il mio marcatore? L'ho provato e non funziona, l'indicatore non viene visualizzato. – Apoz

1

Se il drawable non è definito in un XML, è possibile farlo con questo metodo:

protected Bitmap fromDrawable(final Drawable drawable, final int height, final int width) { 
     final int widthDip = (int) TypedValue.applyDimension(1, width, getResources() 
       .getDisplayMetrics()); 
      final int heightDip = (int) TypedValue.applyDimension(1, width, getResources().getDisplayMetrics()); 
     final Bitmap bitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888); 
     final Canvas canvas = new Canvas(bitmap); 
     drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); 
     drawable.draw(canvas); 
     return bitmap; 
    } 

Nota che se hai bisogno di farlo al di fuori di un Activity, avrete anche bisogno di passare un Context (per chiamare context.getResources().getDisplayMetrics()). Si passa anche l'oggetto DisplayMetrics.

Problemi correlati