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