Android 由区间构成的透明度
把我的耳朵伸出来。我有一个背景位图,我想在上面覆盖另一个有透明剪切的位图。如果剪切是一个基本形状,我可以这样做,但是我需要剪切是两个圆的交点(有点像叶子形状)。我尝试制作第三个位图以生成剪切模板,但我甚至无法获得剪切的清晰表示,更不用说将其用作剪切模板了 有人知道怎么做这样的事吗?以下是我的(简化)尝试: 以下是我得到的图像:Android 由区间构成的透明度,android,canvas,bitmap,porter-duff,Android,Canvas,Bitmap,Porter Duff,把我的耳朵伸出来。我有一个背景位图,我想在上面覆盖另一个有透明剪切的位图。如果剪切是一个基本形状,我可以这样做,但是我需要剪切是两个圆的交点(有点像叶子形状)。我尝试制作第三个位图以生成剪切模板,但我甚至无法获得剪切的清晰表示,更不用说将其用作剪切模板了 有人知道怎么做这样的事吗?以下是我的(简化)尝试: 以下是我得到的图像: 我想要得到的是外面的部分也是红洋红;只有中间的眼睛形状应该是黄色的绿色。 原来的窍门是添加另一层。 // make a secondary overlay th
我想要得到的是外面的部分也是红洋红;只有中间的眼睛形状应该是黄色的绿色。
原来的窍门是添加另一层。
// make a secondary overlay that cuts out the whole circles
Bitmap bitmapOver2 = Bitmap.createBitmap((int) w, (int) h, Bitmap.Config.ARGB_8888);
Canvas canvasOver2 = new Canvas(bitmapOver2);
paint.reset();
paint.setShader(new LinearGradient(0, h / 2 - off, 0, h / 2 + off, Color.RED, Color.MAGENTA, Shader.TileMode.CLAMP));
canvasOver2.drawRect(new RectF(0, 0, w, h), paint);
paint.reset();
paint.setColor(Color.BLACK);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
canvasOver2.drawCircle(w / 2 - (off / 2), h / 2, off, paint);
canvasOver2.drawCircle(w / 2 + (off / 2), h / 2, off, paint);
这样应用:
// draw background and overlay onto main canvas
paint.reset();
paint.setColor(Color.BLACK);
canvas.drawBitmap(bitmapBkg, 0, 0, paint);
canvas.drawBitmap(bitmapOver2, 0, 0, paint);
canvas.drawBitmap(bitmapOver, 0, 0, paint);
基本上这是一个小把戏。它绘制了两次中间层背景,一次是一个完整的圆形切口,另一次是眼睛形状的切口。这两者正好配合在一起,达到了预期的效果
当然@Rotwang,你可能是对的。使用
Path
和arcTo()
将是一个更好的解决方案。我避免使用这种方法的唯一原因是b/carcTo()
是一个api 21+特性。到目前为止,我已经设法将api保持在17+。但是,如果其他任何人想提供一个完整的arcTo()
解决方案,那将是一个很酷的比较。事实证明,诀窍是添加另一层
// make a secondary overlay that cuts out the whole circles
Bitmap bitmapOver2 = Bitmap.createBitmap((int) w, (int) h, Bitmap.Config.ARGB_8888);
Canvas canvasOver2 = new Canvas(bitmapOver2);
paint.reset();
paint.setShader(new LinearGradient(0, h / 2 - off, 0, h / 2 + off, Color.RED, Color.MAGENTA, Shader.TileMode.CLAMP));
canvasOver2.drawRect(new RectF(0, 0, w, h), paint);
paint.reset();
paint.setColor(Color.BLACK);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
canvasOver2.drawCircle(w / 2 - (off / 2), h / 2, off, paint);
canvasOver2.drawCircle(w / 2 + (off / 2), h / 2, off, paint);
这样应用:
// draw background and overlay onto main canvas
paint.reset();
paint.setColor(Color.BLACK);
canvas.drawBitmap(bitmapBkg, 0, 0, paint);
canvas.drawBitmap(bitmapOver2, 0, 0, paint);
canvas.drawBitmap(bitmapOver, 0, 0, paint);
基本上这是一个小把戏。它绘制了两次中间层背景,一次是一个完整的圆形切口,另一次是眼睛形状的切口。这两者正好配合在一起,达到了预期的效果
当然@Rotwang,你可能是对的。使用
Path
和arcTo()
将是一个更好的解决方案。我避免使用这种方法的唯一原因是b/carcTo()
是一个api 21+特性。到目前为止,我已经设法将api保持在17+。但是,如果其他人想提供一个完整的arcTo()
解决方案,比较起来会很酷。也许可以利用PorterDuff来组合图像?这就是我一直试图使用的。哪里出了问题?上面的代码显示了我能得到的最接近的结果。我得到了一张剪贴画,但是背景的其余部分应该是红色的洋红覆盖层——我只得到了圆圈。你能发布一张你想要的和你得到的图片吗?也许可以利用PorterDuff来组合这些图片?这就是我一直试图使用的。哪里出了问题?上面的代码显示了我能得到的最接近的结果。我有一个剪贴画,但背景的其余部分应该是红色洋红的覆盖层——我只得到了圆圈。你能贴一张你想要的和你得到的图片吗?