Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 由区间构成的透明度_Android_Canvas_Bitmap_Porter Duff - Fatal编程技术网

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/c
arcTo()
是一个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/c
arcTo()
是一个api 21+特性。到目前为止,我已经设法将api保持在17+。但是,如果其他人想提供一个完整的
arcTo()
解决方案,比较起来会很酷。

也许可以利用PorterDuff来组合图像?这就是我一直试图使用的。哪里出了问题?上面的代码显示了我能得到的最接近的结果。我得到了一张剪贴画,但是背景的其余部分应该是红色的洋红覆盖层——我只得到了圆圈。你能发布一张你想要的和你得到的图片吗?也许可以利用PorterDuff来组合这些图片?这就是我一直试图使用的。哪里出了问题?上面的代码显示了我能得到的最接近的结果。我有一个剪贴画,但背景的其余部分应该是红色洋红的覆盖层——我只得到了圆圈。你能贴一张你想要的和你得到的图片吗?