Cac*_*tus 6 java android gradient canvas bitmap
我想画一个Bitmap
上的Canvas
,应用了(线性)α-梯度.重要的是,我不想用任何其他颜色覆盖图像; 背景(来自我将要绘制View
的背后的s )应该只是"闪耀".为了说明,我的目标是这样的(棋盘图案代表背后)View
Canvas
View
有人会认为我可以这样做:
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);
Run Code Online (Sandbox Code Playgroud)
但是,这里LinearGradient
的论点需要是颜色,而不是alpha值; 所以我没有办法指明,例如应该是完全透明的,应该是完全不透明的(不应用任何颜色叠加).FROM
TO
FROM
TO
使用a 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);
}
}
Run Code Online (Sandbox Code Playgroud)
基于这个关于 masking 的答案,我能够使用辅助的屏幕外画布来做到这一点:
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);
Run Code Online (Sandbox Code Playgroud)