最近在项目中遇到一个问题,使用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绘制时,没有底色,导致抗锯齿无法采样进行颜色的线性插值,所以抗锯齿无效,这时只能自己先绘制一层白色底色,使其能够采样,去掉锯齿效果。