概述
Paint的API大致可以分為四類:
- 顏色
- 效果
- drawText()相關(guān)
- 初始化
顏色
setColor(int color)
setARGB(int a,int r,int g,int b)
setShader(Shader shader)
當設(shè)置了 Shader 之后,Paint 在繪制圖形和文字時就不使用 setColor/ARGB() 設(shè)置的顏色了,而是使用 Shader 的方案中的顏色。
包括LinearGradient、RadialGradient、SweepGradient、BitmapShader、ComposeShader這幾個
BitmapShader
用Bitmap的像素來作為圖形或文字的填充。
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.batman);
Shader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
paint.setShader(shader);
...
canvas.drawCircle(300, 300, 200, paint);
以上代碼可實現(xiàn)圓形圖像
ComposeShader混合著色器
所謂混合,就是把兩個Shader一起使用
ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode)
// shaderA,shaderB:兩個相繼使用的Shader
// mode:連個Shader的疊加模式,即shaderA和shaderB應(yīng)該怎么樣共同繪制。它的類型是PorterDuff.Mode。
setColorFilter(ColorFilter colorFilter)
顏色過濾
在 Paint 里設(shè)置 ColorFilter ,使用的是 Paint.setColorFilter(ColorFilter filter) 方法。 ColorFilter 并不直接使用,而是使用它的子類。它共有三個子類:LightingColorFilter PorterDuffColorFilter 和 ColorMatrixColorFilter。
LightingColorFilter(int mul,int add)
R' = R * mul.R / 0xff + add.R
G' = G * mul.G / 0xff + add.G
B' = B * mul.B / 0xff + add.B
ColorMatrixColorFilter
ColorMatrixColorFilter 使用一個 ColorMatrix 來對顏色進行處理。 ColorMatrix 這個類,內(nèi)部是一個 4x5 的矩陣:
[ a, b, c, d, e,
f, g, h, i, j,
k, l, m, n, o,
p, q, r, s, t ]
//----------------------
R’ = a*R + b*G + c*B + d*A + e;
G’ = f*R + g*G + h*B + i*A + j;
B’ = k*R + l*G + m*B + n*A + o;
A’ = p*R + q*G + r*B + s*A + t;
setXfermode(Xfermode xfermode)
Xfermode通俗的說,其實就是要你以繪制的內(nèi)容作為源圖像,以View中已有的內(nèi)容作為目標圖像,選取一個PorterDuff.Mode作為繪制內(nèi)容的顏色處理方案。
Xfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.DST_IN);// 只有這一個子類
...
canvas.drawBitmap(rectBitmap, 0, 0, paint); // 畫方
paint.setXfermode(xfermode); // 設(shè)置 Xfermode
canvas.drawBitmap(circleBitmap, 0, 0, paint); // 畫圓
paint.setXfermode(null); // 用完及時清除 Xfermode
PorterDuff.Mode在Paint一共有三處API:
| API | 用途 |
|---|---|
| ComposeShader | 混合兩個Shader |
| PorterDuffColorFilter | 增加一個單色的ColorFilter |
| Xfermode | 設(shè)置繪制內(nèi)容和View中已有內(nèi)容的混合計算方式 |
離屏緩沖
Canvas.saveLayer()、View.setLayerType
控制好透明區(qū)域

透明區(qū)域過小而覆蓋不到的地方,將不會受到Xfermode的影響。
效果
抗鋸齒setAntiAlias()
setStyle()設(shè)置樣式
設(shè)置線條形狀
設(shè)置線條形狀的一共有 4 個方法:setStrokeWidth(float width), setStrokeCap(Paint.Cap cap), setStrokeJoin(Paint.Join join), setStrokeMiter(float miter)
色彩優(yōu)化
setDither(dither) ,設(shè)置抖動來優(yōu)化色彩深度降低時的繪制效果; setFilterBitmap(filterBitmap) ,設(shè)置雙線性過濾來優(yōu)化 Bitmap 放大繪制的效果。
setPathEffect(PathEffect effect)
使用PathEffect來給圖形的輪廓設(shè)置效果。對Canvas所有的圖形繪制有效。
CornerPathEffect

DiscreatePathEffect

DashPathEffect

PathDashPathEffect

SumPathEffect

這是一個組合效果類的 PathEffect 。它的行為特別簡單,就是分別按照兩種 PathEffect 分別對目標進行繪制。
ComposePathEffect

setMaskFilter()
BlurMaskFilter、EmbossMaskFilter
獲取繪制的path
getFillPath()、getTextPath()
drawText()相關(guān)
初始化類
reset()
重置Paint的所有屬性為默認值
set(Paint src)
把src的所有屬性全部復(fù)制過來
setFlags(int flags)
批量設(shè)置flags
paint.setFlags(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);