Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android-使用位图作为渐变遮罩_Java_Android_Bitmap_Gradient - Fatal编程技术网

Java Android-使用位图作为渐变遮罩

Java Android-使用位图作为渐变遮罩,java,android,bitmap,gradient,Java,Android,Bitmap,Gradient,我已经在android应用程序中实现了洪水填充算法。我实现算法的方式实际上并没有改变源位图,而是创建了填充区域的新位图。即 洪水用红色填满了这个圆圈 将生成此位图(位图中的所有其他内容都是透明的) 然后我再次将其合并为一个位图。这对纯色效果很好,但我希望能够实现渐变整体填充,这样,如果用户填充同一个圆,选择红色和蓝色,生成的位图将如下所示 我的问题是,有没有一种方法,我可以使用红色圆圈作为某种遮罩,以使所需的梯度?还是我必须自己写一个梯度发生器?多亏了普斯金的提示,我才找到了答案 其思想是

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

洪水用红色填满了这个圆圈

将生成此位图(位图中的所有其他内容都是透明的)

然后我再次将其合并为一个位图。这对纯色效果很好,但我希望能够实现渐变整体填充,这样,如果用户填充同一个圆,选择红色和蓝色,生成的位图将如下所示


我的问题是,有没有一种方法,我可以使用红色圆圈作为某种遮罩,以使所需的梯度?还是我必须自己写一个梯度发生器?

多亏了普斯金的提示,我才找到了答案

其思想是创建画布,在画布上绘制遮罩,创建所需的渐变,然后在PorterDuffXfermode中使用SRC_在画布上绘制渐变。代码如下:

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(源)是渐变。PorterDuff模式下的SRC_意味着在与DST相交的任何地方绘制SRC


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

请阅读有关android.graphics.PorterDuffXfermode的信息。