2013-04-16 14 views
6

Konwertuję starą aplikację z wersji 1 na 2 i mam problem z kolorem ikon znaczników. Mam podstawową, białą ikonę i trzeba ją pokolorować.Konwertowanie rysowanego na bitmapę w celu zmiany koloru znacznika w Google Maps Android API v2

W v1, zrobiłem to w ten sposób:

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); 

Od v2 Markery nie akceptują kanału alfa dla ich ikony, myślałem o przekształcenie rozciągliwej do bitmapy tak:

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))); 

Ale z jakiegoś powodu nie działa. Ikony pozostają białe. Ktoś wie dlaczego?

Z góry dziękuję.

Odpowiedz

6

OK, oto jak to zrobiłem na koniec dnia:

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

Dzięki za udostępnienie. Czy musiałeś obsłużyć OutOfMemoryExceptions? – sealskej

0

Nie jestem pewien, co robi DrawableUtils, ale przesyłasz go do BitmapDrawable. Czy to naprawdę BitmapDrawable?

Oto niektóre kodu, aby wyodrębnić bitmapy z każdego rodzaju odkształcalne:

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); 

pomysł jest utworzenie płótno na zmienny bitmapy i wyciągnąć ten rozciągliwej na płótnie

edycji :

Właśnie widziałem odpowiedź @Aalizator i tak, moja odpowiedź jest dobra, jeśli nie masz Szuflady jako zasobu. Ale jeśli to zrobisz, zamiast tego skorzystaj z jego odpowiedzi.

+0

Nie mam odlewania DrawableUtils do rozciągliwej, jestem po prostu używając go do zmiany rozmiaru rozciągliwej do pewnej wielkości. Ponadto, dziękuję za radę, ale jestem zdezorientowany co do tego, co powinienem napisać dla "wyświetlacza" i "konfiguracji". – Apoz

+0

Przepraszam, powinienem był wyjaśnić nieco więcej, a także wystąpił błąd (sprawdź zaktualizowany kod). Konfiguracja może być jedną z opcji tutaj: https://developer.android.com/reference/android/graphics/Bitmap.Config.html i wyświetlić opcje tutaj https://developer.android.com/reference /android/util/DisplayMetrics.html Na wyświetlaczu można uzyskać dane wyświetlacza i uważam, że już wstępnie skalowałem bitmapę do ekranu, ale musisz przetestować to dla siebie, ponieważ jest to tylko moje przypuszczenie. Ale jak widać na edycji, można po prostu zbudować bez wyświetlacza. – Budius

+0

Ale co mam teraz zrobić? Czy powinienem użyć mapy bitowej jako ikony mojego znacznika? Próbowałem go i to nie działa, znacznik się nie wyświetla. – Apoz

1

Jeśli odkształcalne nie jest zdefiniowane w formacie XML, można to zrobić za pomocą tej metody:

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; 
    } 

Zauważ, że jeśli trzeba to zrobić z poza Activity, musisz również przekazać Context (aby zadzwonić pod numer context.getResources().getDisplayMetrics()). Przekazujesz również obiekt DisplayMetrics.

Powiązane problemy