使用alpha渐变将位图绘制到canvas
我想在Canvas
上绘制一个Bitmap
,并应用(线性)alpha渐变。 重要的是,我不想用任何其他颜色覆盖图像; 背景(来自View
背后的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);
但是这里的LinearGradient
的FROM
和TO
参数需要是颜色,而不是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);
- 单独螺纹中的Acclerometer传感器
- 从文件视图的url设置typeFace的任何方法?
- 如何在Java Android中为客户端请求设置HttpPost标头
- java.lang.NoClassDefFoundError:com.google.android.gms.R $ string
- 使用LibGDX,你如何使用单独的图像动画?
- 尝试从我的android java应用程序调用web服务时android.os.NetworkOnMainThreadExceptionexception?
- 找到浪费记忆的课程
- 错误不兼容类型:android.app.FragmentManager无法转换为android.support.v4.app.FragmentManager
- BitmapFactory.decodeFile返回null