Paint使用

2D绘图中可以了解到Paint的基本使用,使用这些基本方法可以实现一般的绘制需求,如果要实现更加丰富的绘图效果,需要了解Paint的更详细使用。

Paint的方法按功能可以分为四类:颜色处理、绘制效果、文字绘制和初始化相关。

颜色处理

颜色处理有三个层次:直接使用设置颜色的API给图形和文字设置颜色;使用setColorFilter()基于颜色进行过滤处理;使用setXfermode()处理源图像和Canvas已有内容的关系。

颜色设置

Paint设置颜色的方法有两种:一种是直接用Paint.setColor/ARGB()来设置颜色,另一种是使用Shader来指定着色方案。

直接设置颜色

  • setColor(int color)
  • setARGB(int a, int r, int g, int b)

使用Shader

通过setShader(Shader shader)设置Shader后,Paint 在绘制图形和文字时就不使用setColor/ARGB()设置的颜色了,而是使用Shader中的颜色方案。系统提供的Shader有以下几类:

  • LinearGradient 线性渐变
  • RadialGradient 辐射渐变
  • BitmapShader 用Bitmap的像素来作为图形或文字的填充

上面三种Shader都有3种着色规则(TileMode):CLAMP会在端点之外延续端点处的颜色;MIRROR是镜像模式;REPEAT是重复模式。

  • SweepGradient 扫描渐变
  • ComposeShader 混合着色器,把两个Shader叠加使用
    叠加使用时,需要用到叠加模式,它的类型是PorterDuff.Mode,决定shaderA和shaderB应该怎样共同绘制。

设置滤色器

通过setColorFilter(ColorFilter colorFilter)设置滤色器,系统提供的ColorFilter有以下几类:

  • LightingColorFilter
    模拟简单的光照效果。

  • PorterDuffColorFilter
    使用一个指定的颜色和一种指定的PorterDuff.Mode来与绘制对象进行合成。

  • ColorMatrixColorFilter
    使用一个ColorMatrix来对颜色进行处理,具体使用可以查看图像特效中的颜色特效。

设置TransferMode

通过setXfermode(Xfermode xfermode)设置TransferMode,”Xfermode”是”Transfer mode”的简写,指的是要绘制的内容和Canvas目标位置的内容进行颜色结合的模式,简单来说,就是以要绘制的内容作为源图像,以Canvas中已有的内容作为目标图像,选取一个PorterDuff.Mode作为绘制内容的颜色处理方案。

创建Xfermode的时候其实是创建的它的子类PorterDuffXfermode,而事实上,Xfermode只有这一个子类。

绘制效果

绘制效果指的就是抗锯齿、填充/轮廓、线条宽度等等这些。

抗锯齿

使用setAntiAlias (boolean b)设置是否抗锯齿。

绘制风格

使用setStyle(Paint.Style style)设置图形是线条风格还是填充风格的(或者二者并用)。

线条形状

  • setStrokeWidth(float width)
    设置线条宽度。单位为像素,默认值是 0。

  • setStrokeCap(Paint.Cap cap)
    设置线头的形状。线头形状有三种:BUTT平头、ROUND圆头、SQUARE方头。默认为BUTT。

  • setStrokeJoin(Paint.Join join)
    设置拐角的形状。有三个值可以选择:MITER尖角、 BEVEL平角和ROUND 圆角。默认为MITER。

  • setStrokeMiter(float miter)
    这个方法是对于setStrokeJoin()的一个补充,它用于设置MITER型拐角的延长线的最大值,所谓“延长线的最大值”。

色彩优化

  • setDither(boolean dither)
    设置图像的抖动。

  • setFilterBitmap(boolean filter)
    设置是否使用双线性过滤来绘制Bitmap。图像在放大绘制的时候,默认使用的是最近邻插值过滤,这种算法简单,但会出现马赛克现象;而如果开启了双线性过滤,就可以让结果图像显得更加平滑。

PathEffect

通过setPathEffect(PathEffect effect)给图形的轮廓设置效果,对Canvas所有的图形绘制有效,即对 drawLine() drawCircle() drawPath() 这些方法有效。

单一效果的PathEffect有:

  • CornerPathEffect
    把所有拐角变成圆角。

  • DiscretePathEffect
    把线条进行随机的偏离,让轮廓变得乱七八糟。

  • DashPathEffect
    使用虚线来绘制线条。

  • PathDashPathEffect
    比DashPathEffect多一个前缀Path,顾名思义,它是使用一个Path来绘制“虚线”。

组合效果类的PathEffect有:

  • SumPathEffect
    按照两种PathEffect分别对目标进行绘制。

  • ComposePathEffect
    先对目标Path使用一个PathEffect,然后再对这个改变后的Path使用另一个PathEffect。

添加阴影

具体使用setShadowLayer(float radius, float dx, float dy, int shadowColor)方法。radius是阴影的模糊范围;dx dy是阴影的偏移量;shadowColor是阴影的颜色。

如果要清除阴影层,使用clearShadowLayer()方法。

MaskFilter

setShadowLayer()设置的是绘制层下方的附加效果;而MaskFilter和它相反,setMaskFilter(filter)设置的是绘制层上方的附加效果。

前面有一个setColorFilter(filter)方法,它对每个像素的颜色进行过滤;而setMaskFilter(filter)是基于整个画面来进行过滤。

  • BlurMaskFilter 模糊效果
  • EmbossMaskFilter 浮雕效果

获取绘制的Path

根据Paint的设置,计算出绘制Path或文字时的实际Path,所谓实际Path,指的就是drawPath()绘制内容的轮廓,要算上线条宽度和设置的PathEffect。

  • getFillPath(Path src, Path dst)
    src是原Path,而dst就是实际Path的保存位置。

  • getTextPath()
    获取的就是目标文字所对应的Path。

获取绘制的Path主要是用于图形和文字的装饰效果的位置计算,比如自定义的下划线效果

文字绘制

Paint有很多文字绘制相关的方法,即和drawText()相关的方法,这些方法可以设置文字大小、文字间隔、文字效果等。除此之外,Paint还有很多与文字绘制相关的设置或计算的方法,具体可以参考官方文档。

初始化相关

这一类方法很简单,它们是用来初始化Paint对象,或者是批量设置Paint的多个属性的方法。

  • reset()
    重置Paint的所有属性为默认值。相当于重新new一个,不过性能相对要高。

  • set(Paint src)
    把src的所有属性全部复制过来。相当于调用src所有的get方法,然后调用这个Paint的对应的set方法来设置它们。

  • setFlags(int flags)
    批量设置flags。相当于依次调用它们的set方法。

这里只是简单介绍了Paint提供的绘制功能,详细介绍可以参考HenCoder的Paint详解

坚持原创技术分享,您的支持将鼓励我继续创作!