【问题标题】:Canvas doesn't draw colors with an alpha as they supposed to be drawn画布不会像应该绘制的那样使用 alpha 绘制颜色
【发布时间】:2017-06-07 03:00:44
【问题描述】:

经过几天的尝试,我感到很沮丧。

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

但是当我启动应用程序查看结果时,我看到了:

有些颜色比应有的颜色更深或颜色更深。例如,左边的栏应该是全白的。

我很快制作了一张图片,展示了它的外观:

这是我的绘图函数中的代码:

        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);
        }

我错过了什么?这就是 Canvas 的工作原理吗?我该如何解决这个问题,使它看起来像我在 GIMP 中制作的示例?

【问题讨论】:

    标签: android canvas transparent alpha


    【解决方案1】:

    因为你的算法是错误的。创建颜色的正方形与平滑渐变不同。您的方法将像您在上面看到的那样产生伪影。与其尝试自己做,不如使用平台中已经内置的 GradientDrawables。

    【讨论】:

      【解决方案2】:

      (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);
          }
      }
      

      图像压缩导致一些问题,在手机上一切正常

      【讨论】:

      • 我更改了我的代码以使其与您的匹配,但它仍然显示来自上方的图像。可能出现问题是因为我渲染它的方式不同。有没有办法让你把你的项目发给我,也许是通过电子邮件或 Skype?感谢您的帮助。
      • 我没有做任何特别的事情,这里是项目github.com/fantasyRqg/GradientTest
      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-15
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-24
        • 1970-01-01
        相关资源
        最近更新 更多