背景:
实现采用基本线条简单画板功能时,记忆Path后用Canvas的drawPath进行线条绘制时,发现绘出的线条会有明显的毛边(锯齿)。
// Paint相关
Paint p = new Paint();
p.setARGB(255, (255*mBrightnessPen)/100, (255*mBrightnessPen)/100, (255*mBrightnessPen)/100);
p.setStyle(Paint.Style.STROKE); // 设置画笔模式为描边
p.setStrokeWidth(mPenWidth*mPenWidthSize); // 设置画笔宽度(5*3 px)
// Canvas相关
Bitmap canvasBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
Canvas mCacheCanvas = new Canvas(canvasBitmap);
方法 1:
通过Paint 的抗锯齿属性设置,发现效果并不算好,可能不适用drawPath。
p.setAntiAlias(true);
方法 2:
创建Paint滤波器,对位图进行滤波处理。
第一个参数是你要清除的标志位,第二个参数是你要设置的标志位。此处设置为对位图进行滤波。
效果依然不是很理想,可能不适用drawPath。
// Canvas设置滤波器
mCacheCanvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG));
// Paint设置滤波器属性true
p.setFilterBitmap(true);
方法 3:
转换思路,是否可以通过模糊线条边缘来实现去锯齿。
查询Paint的通用接口,发现有下记两个方法。
/**
* Set the paint's Cap.
*
* @param cap set the paint's line cap style, used whenever the paint's
* style is Stroke or StrokeAndFill.
*/
public void setStrokeCap(Cap cap) {
nSetStrokeCap(mNativePaint, cap.nativeInt);
}
/**
* Set the paint's Join.
*
* @param join set the paint's Join, used whenever the paint's style is
* Stroke or StrokeAndFill.
*/
public void setStrokeJoin(Join join) {
nSetStrokeJoin(mNativePaint, join.nativeInt);
}
尝试了下,效果非常显著。
// Paint追加相关设置
p.setStrokeCap(Paint.Cap.ROUND);
p.setStrokeJoin(Paint.Join.ROUND);
引用资料:
抗锯齿方法两种(其一:paint.setAntiAlias(ture);paint.setBitmapFilter(true))_paint.setantialias(true)-CSDN博客
https://www.cnblogs.com/duanweishi/p/4449500.html Android画图之抗锯齿 paint 和 Canvas 两种方式