Canvas drawPath绘图线条边缘有毛边(锯齿)

背景:

实现采用基本线条简单画板功能时,记忆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 两种方式

Android Paint 详细讲解-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值