2017-06-07 60 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。