2015-09-22 30 views
0

我在android应用程序中实现了泛洪填充算法。我实现算法的方式实际上并没有改变源位图,而是创建了填充区域的新位图。 I.E.Android - 使用位图作为渐变蒙版

洪水填补这个圈子里有红色

circle

会产生这样的位图(这里的一切的位图否则是透明的)

red

,然后我再合并成一个单一位图。这个伟大的工程为纯色,但我希望能够实现一个渐变颜色填充,这样,如果用户填写同一个圆上,选择红色和蓝色,生成位图看起来像这样

redblue

我的问题是,是否有一种方法可以将红色圆圈用作某种掩模来制作所需的渐变效果?或者我必须自己写一个梯度发生器?

+0

阅读关于'android.graphics.PorterDuffXfermode' – pskink

回答

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之间的渐变。