我有一个Drawable(白色圆圈),我想首先着色,然后在ItemizedOverlay中将它用作标记,即我想使用相同的Drawable来显示绿色圆圈和橙色圆圈地图。
在调用ItemizedOverlay.setMarker()之前,只需在drawable上使用setColorFilter似乎不起作用。我也尝试过这里详述的可变位图方法 - setColorFilter doesn't work on Android < 2.2。 两种方法都只是画出没有颜色的白色圆圈。
有人可以帮帮我吗?我在Android 2.2上运行它。
谢谢!
更新
我调整了How to change colors of a Drawable in Android?的代码并让它为我工作。
我的方法如下:
private HashMap<Integer, Drawable> coloredPinCache = new HashMap<Integer, Drawable>();
public static final int ORIGINAL_PIN_COLOR = Color.WHITE;
public static final int COLOR_MATCH_THRESHOLD = 100;
protected Drawable getPinInColor(int color) {
// Check if we already have this in the cache
Drawable result = coloredPinCache.get(color);
// If not, create the Drawable
if (result == null) {
// load the original pin
Bitmap original = BitmapFactory.decodeResource(getResources(), R.drawable.pin);
// create a mutable version of this
Bitmap mutable = original.copy(Bitmap.Config.ARGB_8888, true);
// garbage-collect the original pin, since it is not needed further
original.recycle();
original = null;
// loop through the entire image
// set the original color to whatever color we want
for(int x = 0;x < mutable.getWidth();x++){
for(int y = 0;y < mutable.getHeight();y++) {
if(match(mutable.getPixel(x, y), ORIGINAL_PIN_COLOR))
mutable.setPixel(x, y, color);
}
}
// create the Drawable from the modified bitmap
result = new BitmapDrawable(mutable);
// cache this drawable against its color
coloredPinCache.put(color, result);
}
// give back the colored drawable
return result;
}
private boolean match(int pixel, int color) {
return Math.abs(Color.red(pixel) - Color.red(color)) < COLOR_MATCH_THRESHOLD &&
Math.abs(Color.green(pixel) - Color.green(color)) < COLOR_MATCH_THRESHOLD &&
Math.abs(Color.blue(pixel) - Color.blue(color)) < COLOR_MATCH_THRESHOLD;
}
但是,这种方法非常耗费资源。我仍然想知道是否有更好/更快/更聪明的方法来实现这一目标。
谢谢!