Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.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 Canvas.draw()不透明背景上的透明形状产生254 alpha_Android_Android Canvas - Fatal编程技术网

Android Canvas.draw()不透明背景上的透明形状产生254 alpha

Android Canvas.draw()不透明背景上的透明形状产生254 alpha,android,android-canvas,Android,Android Canvas,当我在桌面上查看保存的位图时,我注意到了这一点(这似乎是一个bug),我几乎无法通过图像文件看到棋盘格图案。我做了一个简单的实验: Bitmap bitmap = new Bitmap(300, 200, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); Paint paint = new Paint(); paint.setColor(Color.argb(150, 0, 255, 0)); canvas.drawC

当我在桌面上查看保存的位图时,我注意到了这一点(这似乎是一个bug),我几乎无法通过图像文件看到棋盘格图案。我做了一个简单的实验:

Bitmap bitmap = new Bitmap(300, 200, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Paint  paint  = new Paint();
paint.setColor(Color.argb(150, 0, 255, 0));
canvas.drawColor(Color.RED);
canvas.drawRect(20, 20, 280, 180, paint);
Log.d("alpha-bug", "Alpha at 30, 30 is "
  + Color.alpha(bitmap.getPixel(30, 30))
);

核实。上述日志
Alpha为30,30为254
。正确的字母是
255
。不管我画的形状的alpha值是多少,我得到254。我假设这是一个舍入误差。还有其他人见过这个吗?这是预期的吗?如果是,为什么?如果没有的话,有什么想法可以绕过它吗?

是的,对我来说似乎是个bug

解决方法可以是使用另一个
位图
绘制半透明形状,然后使用
绘制位图方法。另一个位图的背景是透明的,这样(显然)可以正确地绘制形状。(或者,如果要重用位图,可以使用
drawColor(Color.transparent,PorterDuff.Mode.CLEAR)
将其填充为透明)


示例代码和输出:

Bitmap test = Bitmap.createBitmap(250, 190, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(test);
{ // draw opaque background
    Paint p = new Paint();
    p.setARGB(255, 0, 0, 0);
    c.drawPaint(p);
}
Paint circlePaint = new Paint();
circlePaint.setARGB(128, 255, 255, 255);
Bitmap b;
c.drawText("drawCircle", 30, 40, circlePaint);
c.drawText("drawBitmap", 140, 40, circlePaint);
{ // draw a circle into a temporary bitmap as workaround
    b = MipMap.allocateBitmapSafely(100, 100);
    Canvas ca = new Canvas(b);
    ca.drawCircle(50, 50, 50, circlePaint);
    System.out.println("drawCircle (in temporary bitmap) color: " + Integer.toHexString(b.getPixel(50, 50)));
}
{ // draw circle with circle-drawing method
    c.drawCircle(70, 100, 50, circlePaint);
    System.out.println("drawCircle color: " + Integer.toHexString(test.getPixel(70, 100)));
}
{ // draw circle from the saved bitmap with bitmap-drawing method
    c.drawBitmap(b, 130, 50, null);
    System.out.println("drawBitmap color: " + Integer.toHexString(test.getPixel(170, 100)));
}
String filename = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "test.png";
FileOutputStream out = null;
try {
    out = new FileOutputStream(filename);
    test.compress(Bitmap.CompressFormat.PNG, 90, out);
} catch (Exception e) {
} finally {
    try {
        out.close();
    } catch (IOException e) {
    }
}
控制台输出:

drawCircle(在临时位图中)颜色:80ffffff
drawCircle颜色:FE8181
绘图位图颜色:FF8080

在图像中,左圆圈的颜色是(254129129),右圆圈的颜色是(255128128)。因此,不仅左侧的alpha 254而不是255,R、G和B值也被关1

附言:我们应该向谷歌报告这一点,因为这对于一个解决方案来说是一个过火的做法。

在这里提出了一个问题: