将一个Drawable转换成Bitmap以改变Google Maps Android API v2中标记的颜色

6

我正在将一个旧的应用程序从v1转换为v2版本,但是我的Marker图标的颜色出现了问题。我有一个基本的白色图标,需要进行着色处理。

在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版本以后,标记点不再接受Drawables作为它们的图标,因此我考虑将Drawable转换为Bitmap,代码如下:

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

但是出于某些原因,它没有起作用。图标仍然保持白色。有人知道为什么吗?提前感谢。
3个回答

6

好的,最终我是这样做的:

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
谢谢分享。你需要处理OutOfMemoryExceptions吗? - sealskej

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对象。

0

我不确定这个DrawableUtils在做什么,但你把它转换成了BitmapDrawable。它真的是一个BitmapDrawable吗?

这里有一些代码可以从任何类型的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);

这个想法是在可变位图上创建画布,然后在画布上绘制该可绘制对象。

编辑:

我刚刚看到了@Analizer的答案,如果您有Drawable作为资源,请使用他的答案。


我并不是将DrawableUtils强制转换为Drawable,而是使用它来调整可绘制对象的大小。另外,感谢您的建议,但我对“display”和“config”应该填什么感到困惑。 - Apoz
抱歉,我应该解释得更清楚一些,而且还有一个错误(请检查更新后的代码)。配置可以是此处的任何选项:https://developer.android.com/reference/android/graphics/Bitmap.Config.html,显示选项在此处:https://developer.android.com/reference/android/util/DisplayMetrics.html。你可以获取显示度量标准,并且我认为它已经预先缩放了位图到显示器上,但你需要自己测试一下,因为这只是我的猜测。但正如你在编辑中看到的,你可以不使用显示构建。 - Budius
但是接下来我该怎么做呢?我应该直接使用Bitmap作为标记的图标吗?我已经尝试过了,但它没有显示出来。 - Apoz
这个代码我已经好几个月没碰过了,不太确定。尝试将这个位图放入 ImageView 中。这将测试问题是生成的位图还是您设置标记的方式。 - Budius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接