Android - 使用位图作为渐变蒙版

时间:2015-09-22 17:18:42

标签: java android bitmap gradient

我在Android应用中实现了泛洪填充算法。我实现算法的方式实际上并没有改变源位图,而是创建了填充区域的新位图。即。

用红色

填充此圆圈

circle

会产生这个位图(位图中的其他所有内容都是透明的)

red

然后我再次组合成一个位图。这适用于纯色,但我希望能够实现渐变泛光填充,这样如果用户填充相同的圆,选择红色和蓝色,结果位图将如下所示

redblue

我的问题是,有没有办法可以使用红色圆圈作为某种掩模来制作所需的渐变?或者我自己必须写一个渐变发生器?

1 个答案:

答案 0 :(得分:1)

感谢pskink的提示,我能够找到答案。

您的想法是创建一个画布,向其绘制遮罩,创建所需的渐变,然后使用SRC_IN PorterDuffXfermode在其上绘制渐变。这是代码:

public Bitmap addGradient(Bitmap src, int color1, int color2)
{
    int w = src.getWidth();
    int h = src.getHeight();
    Bitmap result = Bitmap.createBitmap(w,h, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(result);

    canvas.drawBitmap(src, 0, 0, null);

    Paint paint = new Paint();
    LinearGradient shader = new LinearGradient(0,0,0,h, color1, color2, Shader.TileMode.CLAMP);
    paint.setShader(shader);
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    canvas.drawRect(0,0,w,h,paint);

    return result;
}

在这种情况下,DST(目的地)是红色圆圈,SRC(源)是梯度。 SRC_IN PorterDuff模式意味着在与DST相交的任何地方绘制SRC。

请注意,遮罩的颜色并不重要,因为PorterDuff模式只关注DST像素是否透明。生成的位图的颜色将是color1和color2之间的渐变。