使用Bitmap作為繪圖緩衝設定抗鋸齒無效的解決方法
阿新 • • 發佈:2019-02-14
最近在專案中遇到一個問題,使用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繪製時,沒有底色,導致抗鋸齒無法取樣進行顏色的線性插值,所以抗鋸齒無效,這時只能自己先繪製一層白色底色,使其能夠取樣,去掉鋸齒效果。