Преобразование Drawable в растровое изображение для изменения цвета маркера в Google Maps Android API v2

Я конвертирую старое приложение из 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 не принимают Drawables для своих значков, я подумал о преобразовании Drawable в растровое изображение, например:

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 ответа

Решение

Хорошо, вот как я это сделал в конце дня:

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

Если ваш 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;
    }

Обратите внимание, что если вам нужно сделать это из-за пределов ActivityВам также нужно будет пройти Context (чтобы позвонить context.getResources().getDisplayMetrics()). Вы также передаете DisplayMetrics объект вместо

Я не уверен, что делает этот 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 в качестве ресурса. Но если вы это сделаете, используйте вместо этого его ответ.

Другие вопросы по тегам