2017-06-07 63 views
0

经过几天的尝试,我只是沮丧。画布没有绘制颜色与阿尔法,因为他们应该画

我想制作一个简单的应用程序,在背景上绘制从完全透明到白色的颜色渐变。 为了测试,我只用了黑色,白色和灰色的背景。

但是,当我开始应用查看我看到这个结果: screenshot from a phone

一些颜色变成是较为黑暗或有色比他们应该。例如,左栏应该是完全白色的。

我迅速做了,显示应该如何看起来像一个形象: made with GIMP 2

这是我绘制函数代码:

 for(int i = 0; i < 5; i++) { 
      p.setARGB(255, (255/4*(4-i)), (255/4*(4-i)), (255/4*(4-i))); 
      canvas.drawRect(canvas.getWidth()/5*i, 0, canvas.getWidth()/5*(i+1), canvas.getHeight(), p); 
     } 
     for(int i = 0; i < 256; i++) { 
      p.setARGB(i, 255, 255, 255); 
      canvas.drawRect(0, i*(canvas.getHeight()/256), canvas.getWidth(), (i+1)*(canvas.getHeight()/256), p); 
     } 

我缺少什么?这是帆布如何工作?我该如何解决这个问题,使它看起来像我在GIMP中创建的示例?

回答

0

因为你的算法是错误的。创建颜色的正方形与平滑渐变不同。你的方法将会像你在上面看到的那样具有伪像。您可以使用已经内置到平台中的GradientDrawables,而不是自己动手做。

0

(canvas.getHeight()/256)导致精度问题。的

使用float gHeight = canvas.getHeight()/256f;代替(canvas.getHeight()/256)

全码:

private Paint p = new Paint(Paint.ANTI_ALIAS_FLAG); 

@Override 
protected void onDraw(Canvas canvas) { 
    for (int i = 0; i < 5; i++) { 
     p.setARGB(255, (255/4 * (4 - i)), (255/4 * (4 - i)), (255/4 * (4 - i))); 
     canvas.drawRect(canvas.getWidth()/5 * i, 0, canvas.getWidth()/5 * (i + 1), canvas.getHeight(), p); 
    } 
    float gHeight = canvas.getHeight()/256f; 
    for (int i = 0; i < 256; i++) { 
     p.setARGB(i, 255, 255, 255); 

     canvas.drawRect(0, i * gHeight, canvas.getWidth(), (i + 1) * gHeight, p); 
    } 
} 

图像压缩造成一定的问题,在手机一切正常 image compress cause some problem ,on phone everything is ok

+0

我更改了自己的代码,使其与您的代码匹配,但它仍然显示上面的图像。也许问题发生是因为我以不同的方式呈现它。有没有办法让您通过电子邮件或Skype将我的项目发送给我?谢谢你的帮助。 –

+0

我什么都没做,这里是项目https://github.com/fantasyRqg/GradientTest –

0

我固定我的问题。我使用了SurfaceView,默认情况下,它使用RGB_565格式自行着色。质量受到这种格式的影响。要将格式更改为具有Alpha通道的ARGB_8888,您必须将此行添加到您的代码中。

mSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);

这是我的错,我没有说我使用的是SurfaceView显示画布。我感谢所有试图找到我的错误的人,尤其是Fantasy_RQG。