在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详解。