6

我正在将旧应用程序从 v1 转换为 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 Markers 的图标不接受 Drawable,因此我考虑将 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)));

但由于某种原因,它不起作用。图标保持白色。任何人都知道为什么?

提前致谢。

4

3 回答 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)));
于 2013-05-06T12:15:22.950 回答
1

如果你的 drawable 没有在 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;
    }

请注意,如果您需要从 OUTSIDE an 执行此操作Activity,您还需要传递 a Context(以便调用context.getResources().getDisplayMetrics())。您还可以传递DisplayMetrics对象。

于 2013-05-02T14:41:53.770 回答
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 作为资源,我的答案很好。但是,如果您这样做,请改用他的答案。

于 2013-04-16T12:44:42.037 回答