使用alpha渐变将位图绘制到canvas

我想在Canvas上绘制一个Bitmap ,并应用(线性)alpha渐变。 重要的是,我不想用任何其他颜色覆盖图像; 背景(来自View背后的View ,我将绘制这个Canvas )应该只是“闪耀”。 为了说明,我的目标是这样的(棋盘图案代表后面的View

线性alpha梯度

有人会认为我可以这样做:

 Bitmap bitmap = ...; Paint paint = new Paint(); paint.setShader(new LinearGradient(0, 0, 100, 0, FROM, TO, Shader.TileMode.CLAMP)); canvas.drawBitmap(bitmap, 0, 0, paint); 

但是这里的LinearGradientFROMTO参数需要是颜色,而不是alpha值; 所以我没有办法指明例如FROM应该是完全透明的, TO应该是完全不透明的(不应用任何颜色叠加)。

使用ComposeShader ,如下所示:

 class V extends View { Bitmap bitmap; Paint paint = new Paint(); public V(Context context) { super(context); bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.chrome); Shader shaderA = new LinearGradient(0, 0, bitmap.getWidth(), 0, 0xffffffff, 0x00ffffff, Shader.TileMode.CLAMP); Shader shaderB = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); paint.setShader(new ComposeShader(shaderA, shaderB, PorterDuff.Mode.SRC_IN)); } @Override protected void onDraw(Canvas canvas) { canvas.drawRect(0, 0, bitmap.getWidth(), bitmap.getHeight(), paint); } } 

基于这个关于屏蔽的答案 ,我能够使用辅助屏幕外canvas来做到这一点:

 Bitmap backing = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); { Canvas offscreen = new Canvas(backing); offscreen.drawBitmap(bitmap, 0, 0, null); Paint paint = new Paint(); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); paint.setShader(new LinearGradient(0, 0, 100, 0, 0x00000000, 0xFF000000, Shader.TileMode.CLAMP)); offscreen.drawRect(0, 0, bitmap.getWidth(), bitmap.getHeight(), paint); } canvas.drawBitmap(backing, 0, 0, null);