ItemizedOverlay标记为Drawable的setColorFilter

时间:2012-02-11 04:31:54

标签: android google-maps overlay itemizedoverlay

我有一个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;
}

但是,这种方法非常耗费资源。我仍然想知道是否有更好/更快/更聪明的方法来实现这一目标。

谢谢!

0 个答案:

没有答案