感谢 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(destination) 是红色圆圈,SRC(source) 是渐变。 SRC_IN PorterDuff 模式意味着在与 DST 相交的任何地方绘制 SRC。
请注意,遮罩是什么颜色并不重要,因为 PorterDuff 模式只关注 DST 像素是否透明。生成的位图的颜色将是 color1 和 color2 之间的渐变。