1. 程式人生 > >使用Bitmap作為繪圖緩衝設定抗鋸齒無效的解決方法

使用Bitmap作為繪圖緩衝設定抗鋸齒無效的解決方法

最近在專案中遇到一個問題,使用Bitmap作為繪圖緩衝會出現鋸齒,就算給Paint及Bitmap設定抗鋸齒仍沒有任何效果。幾番嘗試找到了解決方法。

先上對比圖

  • 設定抗鋸齒不起作用的圖片

先前的圖片

  • 修改後的圖片

修改後的圖片

想必大家可以清楚地看到第一張圖有著鋸齒,而第二張圖抗鋸齒起作用了。兩張圖都已經開啟了抗鋸齒,但為何效果不一樣呢,具體的修改其實很簡單。

直接繪製路徑是沒有鋸齒的,即在onDraw()中使用

canvas.drawPath(myPath, myPaint);

當我們想使用自定義的bitmap作為繪圖緩衝時,會出現鋸齒,即

@Override
    protected
void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); myBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); myCanvas = new Canvas(myBitmap);//繪製Bitamp的畫布物件 }

然後

@Override
    protected void onDraw(Canvas canvas) {
        super
.onDraw(canvas); //將路徑繪製在自己的Bitmap上 myCanvas.drawPath(myPath, myPaint); //將Bitmap繪製到介面上 canvas.drawBitmap(myBitmap, 0, 0, myPaint); }

如果想避免鋸齒,只需在將路徑繪製到自己的Bitmap前,先繪製一層顏色,即

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        //如果不現在自己的Bitmap上繪製一層顏色,會出現鋸齒
myCanvas.drawColor(Color.WHITE); //將路徑繪製在自己的Bitmap上 myCanvas.drawPath(myPath, myPaint); //將Bitmap繪製到介面上 canvas.drawBitmap(myBitmap, 0, 0, myPaint); }

猜測的原因是使用Bitmap繪製時,沒有底色,導致抗鋸齒無法取樣進行顏色的線性插值,所以抗鋸齒無效,這時只能自己先繪製一層白色底色,使其能夠取樣,去掉鋸齒效果。