2013-04-16 73 views
6

我將舊應用程序從v1轉換爲v2,並且遇到了標記圖標顏色的問題。我有一個基本的白色圖標,它需要着色。將Drawable轉換爲位圖以更改Google Maps Android API中標記的顏色v2

在V1,我就是這麼做的:

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

由於V2標記不接受可繪爲他們的偶像,我想到了繪製對象轉換爲位圖,就像這樣:

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

但由於某種原因,它不起作用。圖標保持白色。有人知道爲什麼

在此先感謝。

回答

6

OK,這裏是我做到了在這一天結束:

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

感謝您的分享。你是否必須處理OutOfMemoryException? – sealskej

0

我不確定這個DrawableUtils在做什麼,但是你將它轉換爲BitmapDrawable。它真的是一個BitmapDrawable?

這裏的一些代碼提取位圖的任何類型的可繪製的:

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

的想法是,你對一個可變的位圖上創建一個畫布,畫在畫布

編輯上繪製:

我剛剛看到@Analizer答案,是的,如果您沒有Drawable作爲資源,我的答案很好。但如果你這樣做,用他的答案來代替。

+0

我不是鑄造DrawableUtils到繪製對象,我只是用它來調整繪製到一定的規模。另外,感謝您的建議,但我很困惑我應該爲「顯示」和「配置」放置什麼。 – Apoz

+0

對不起,我應該多解釋一下,還有一個錯誤(檢查更新的代碼)。配置可以是從這裏的任何選項:https://developer.android.com/reference/android/graphics/Bitmap.Config.html和顯示從這裏的選項https://developer.android.com/reference /android/util/DisplayMetrics.html顯示器可以獲得顯示度量,我認爲它已經預先將位圖縮放到顯示器上,但是你必須自己測試它,因爲這只是我的猜測。但正如您在編輯中看到的那樣,您可以在沒有顯示的情況下進行施工。 – Budius

+0

但我接下來該做什麼?我應該直接使用位圖作爲我的標記圖標嗎?我試過了,它不工作,標記不顯示。 – Apoz

1

如果繪製未在XML定義,你可以用這種方法做:

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

請注意,如果你需要來自外部的Activity做到這一點,你也需要通過Context(爲了撥打context.getResources().getDisplayMetrics())。您也可以傳遞DisplayMetrics對象。

相關問題