Paint 類持有繪制圖形、文本、圖像的樣式和色彩信息,并且對外提供了一系列方法來設置這些信息。
一、畫筆基本操作
set(Paint src)
直接把另一個畫筆的屬性復制給當前畫筆
reset()
恢復畫筆屬性為默認配置
setAntiAlias(boolean aa)
設置是否開啟抗鋸齒,一般在繪制棱角分明的圖形比如矩形,位圖時不需要開啟
setDither(boolean dither)
設置是否開啟圖像抖動處理,會使繪制出來的圖像顏色更加平滑飽滿,更加清晰
setFlags(int flags)
設置一些標識,抗鋸齒,防抖動等
二、畫筆顏色和樣式
setAlpha(int a)
setARGB(int a,int r,int g,int b)
setColor(int color))
setStyle(Paint.Style style)
設置畫筆樣式,有三種取值:
- Paint.Style.FILL:填充;
- Paint.Style.FILL_AND_STROKE:填充和描邊;
- PaintStyle.STROKE:描邊
setStokeWidth(float width)
設置畫筆寬度
setStrokeCap(Paint.Cap cap)
設置畫筆筆觸風格,當畫筆樣式為 Style.STROKE 時影響畫筆始末端,有三種取值:
- Paint.Cap.BUTT:無風格;
- Paint.Cap.ROUND:半圓形;
- Paint.Cap.SQUARE:方形
setStrokeJoin(Paint.Join join)
設置圖形連接點的結合方式,在畫矩形時會用到,三種取值:
- Paint.Join.BEVEL:直線;
- Paint.Join.MITER:角度;
- Paint.Join.ROUND:圓弧;
setStrokeMiter(float meter)
設置畫筆的傾斜度,取值大于0,大概是設置圖形銳角的樣式
三、文本相關操作
setTextAlign(Paint.Align align)
設置文本對齊方式,三種取值:
- Paint.Align.LEFT:以基準點左對齊;
- Paint.Align.CENTER:以基準點居中對齊;
- Paint.Align.RIGHT:以基準點右對齊;
setTextLocal(Local local)
設置地理位置,比如顯示中文、日文、韓文等,默認顯示 Locale.getDefault() 即可
setTextScaleX (float scaleX)
設置文字水平方向的縮放因子,默認為1.0,大于1.0拉伸文字寬度,小于1.0壓縮文字寬度
setTextSize(float textSize)
設置字體大小,必須大于0
setTextSkewX (float skewX)
設置文本在水平方向的傾斜,默認值為0,推薦為0.25
setTypeface(Typeface typeface)
設置字體樣式,可以是 Typeface 類中的樣式:
- Typeface.DEFAULT:默認正常字體樣式;
- Typeface.DEFAULT_BOLD:默認粗體樣式;
- Typeface.MONOSPACE:等寬字體;
- Typeface.SANS_SERIF:非襯線字體;
- Typeface.SERIF:襯線字體;
也可以用 Typeface.createFromAsset(AssetManager mgr, String path)
方法從 assets 目錄中加載字體
setElegantTextHeight(boolean elegant)
設置優雅的文字高度,這個設置可能會對 FontMetrics 產生影響
setLetterSpacing(float letterSpacing)
設置行的間距,默認值是0,負值行間距會收縮
setFontFeatureSettings(String settings)
設置字體樣式,可以設置 CSS 樣式
setFakeBoldText (boolean fakeBoldText)
設置字體樣式,可以設置 CSS 樣式
setLinearText(boolean linearText)
設置是否打開線性文本標識,設置為 true 表示不需要文本緩存
setSubpixelText(boolean subpixelText)
設置亞像素,是對文本的一種優化設置,可以讓文字看起來更加清晰明顯,有助于文本在 LCD 屏幕上的顯示效果
setUnderlineText(boolean underlineText)
設置文本的下劃線
setStrikeThruText(boolean strikeThruText)
設置文本的刪除線
setHinting(int mode)
設置畫筆隱藏模式,可以為 HINTING_OFF 或者 HINTING_ON
四、測量文本寬高
測量文本寬度
measureText(String text)
measureText(String text, int start, int end)
measureText(char[] text, int index, int count)
measureText(CharSequence text, int start, int end)
剪切顯示,大于 maxWidth 時截取指定長度顯示
breakText(char[] text, int index, int count,float maxWidth, float[] measuredWidth)
breakText(CharSequence text, int start, int end, boolean measureForwards,float maxWidth, float[] measuredWidth)
breakText(String text, boolean measureForwards,float maxWidth, float[] measuredWidth)
獲取指定范圍內的字符寬度,保存到 widths 數組中
getTextWidths(String text, float[] widths)
getTextWidths(String text, int start, int end, float[] widths)
getTextWidths(char[] text, int index, int count,float[] widths)
getTextWidths(CharSequence text, int start, int end,float[] widths)
獲取文本邊界,保存到 bounds 中,可以通過這計算文本寬高
getTextBounds(String text, int start, int end, Rect bounds)
getTextBounds(char[] text, int index, int count, Rect bounds)
獲取指定字體大小的字體屬性
getFontMetrics()
getFontMetrics(FontMetrics metrics)
getFontMetricsInt()
getFontMetricsInt(FontMetricsInt fmi)
FontMetrics 類有五個屬性:
- ascent:字符最高處到基準線的距離,負值;
- descent:字符最低處到基準線的距離;
- top:最高字符到基準線的距離;
- bottom:最低字符到基準線的距離;
- lending:上一行字符的 descent 到下一行字符的 ascent 的距離
五、圖像顏色的相關操作
setFilterBitmap(boolean filter)
對位圖進行濾波處理,如果該項設置為 true,則圖像在動畫進行中會濾掉對 Bitmap 圖像的優化操作,加快顯示
setColorFilter(ColorFilter filter)
設置顏色過濾,參數可以是 ColorMatrixColorFilter、LightingColorFilter 和 PorterDuffColorFilter 三個類的子類,它們都是 ColorFilter 類的子類
- ColorMatrixColorFilter(色彩矩陣顏色過濾器)
構造函數:
ColorMatrixColorFilter(ColorMatrixmatrix) ColorMatrixColorFilter (float[] array)
在構造函數中傳入 ColorMatrix 參數,通過色彩矩陣 ColorMatrix 對象來改變顏色,該類是一個 4 x 5 的矩陣:
ColorMatrix colorMatrix = new ColorMatrix(new float[]{
1, 0, 0, 0, 0, // 紅色向量
0, 1, 0, 0, 0, // 綠色向量
0, 0, 1, 0, 0, // 藍色向量
0, 0, 0, 1, 0, // 透明度向量
});
矩陣的第一行表示 R 向量,第二行表示 G 向量,第三行表示 B 向量,第四行表示 A 向量,每一行的第一個元素表示 R 值,第二個元素表示 G 值,第三個元素表示 B 值,第四個元素表示 A 值,其取值范圍為 0.0f ~ 2.0f,1.0f 表示保持原圖 RGB 值,第五個元素表示偏移值,我們想讓圖片更偏向于哪個顏色,就增大哪個向量的偏移值。
- LightingColorFilter(光照顏色過濾)
該類構造方法只有一個LightingColorFilter (int mul, int add)
第一個參數 mul 全稱是 colorMultiply,意為色彩倍增,第二個參數 add 全稱 colorAdd,意為色彩添加,這兩個值都是十六進制的色彩值 0xAARRGGBB,當 mul 是 0xFFFFFFFF,add 是 0x00000000 時原圖不會有任何改變,如果想要減少 A、R、G、B 某一顏色值,就把 mul 參數對應的位數減小,如果想增加某一顏色值,就把 add 參數對應的位數增加,取值范圍為 00 ~ FF - PorterDuffColorFilter
該類只有一個構造函數PorterDuffColorFilter(int color,PorterDuff.Modemode)
第二個參數是 PorterDuff.Mode 類中的常量值,表示混合模式,要混合的兩種顏色,一個是第一個參數所設定的十六進制色彩值,另一個顏色就是畫布上的元素,兩種顏色根據混合模式進行混合產生最終的結果。
PorterDuff.Mode 中的混合模式不僅應用于圖像色彩混合,還應用于圖形混合,后面再具體看。
setMaskFilter(MaskFilter maskFilter)
設置濾鏡效果,需要傳入一個 MaskFilter 參數,MaskFilter 有兩個子類:
BlurMaskFilter:模糊遮罩濾鏡
該類只有一個構造函數:BlurMaskFilter(float radius,BlurMaskFilter.Blurstyle)
第一個參數表示陰影范圍,第二個參數是 BlurMaskFilter.Blur 的枚舉值,表示模糊類型,有四種取值:Blur.NORMAL:將整個圖像模糊掉;
Blur.SOLID:在圖像的邊界外產生一層與 Paint 顏色一致的陰影效果而不影響圖像本身;
Blur.INNER:在圖像內部產生陰影效果,與 Blur.SOLID 效果相反;
Blur.OUTER:在圖像邊界外產生一層陰影效果,與 blur.SOLD 不同的是圖像會變透明;
BlurMaskFilter 是根據 Alpha 通道的邊界來計算模糊的,如果用它對圖片進行處理,沒有任何效果。如果想給圖片一個類似陰影的效果,可以用Bitmap#extractAlpha()
方法獲取位圖的 Alpha 通道圖,在繪制位圖前先給 Alpha 通道圖繪制一個模糊效果。EmbossMaskFilter:浮雕遮罩濾鏡
構造函數:EmbossMaskFilter (float[] direction, float ambient, float specular, float blurRadius)
setPathEffect(PathEffect effect)
設置繪制路徑的效果,PathEffect 類有六個子類:
- CornerPathEffect:將路徑的轉角變得圓滑,該類的構造函數只有一個參數 radius,表示轉角處的圓滑程度;
- DiscretePathEffect:會在路徑上繪制很多“雜點”的突出來模擬一種類似生銹鐵絲的效果,其構造方法有兩個參數,第一個表示雜點的密度,值越小雜點越密集,第二個參數表示雜點突出的大小,值越大突出的距離越大;
- DashPathEffect:主要用于畫虛線,第一個參數是一個 float 數組,元素個數必須大于等于2,奇數元素表示線段長度,偶數元素表示間隔長度,第二個參數表示偏移值;
- PathDashPathEffect:類似于 DashPathEffect,不同的是可以自定義路徑虛線的樣式
構造函數publicPathDashPathEffect(Pathshape, float advance, float phase,PathDashPathEffect.Stylestyle)
第一個參數通過一個 Path 定義虛線的形狀,第四個參數是一個枚舉值,有 MORPH、ROTATE、TRANSLATE 三種取值; - ComposePathEffect 和 SumPathEffect:組合兩種路徑效果
setShader(Shader shader)
設置著色器,Shader 類有五個子類:
- BitmapShader(圖像渲染)
構造方法:BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)
第一個參數 bitmap 表示用于填充的位圖,第二、三個參數 tileX、tileY 分別表示 x、y 方向的平鋪模式,取自 Shader 內部的 TileMode 枚舉值,TileMode.CLAMP 表示拉伸邊緣,TileMode.REPEAT 表示重復,TileMode.MIRROR 表示鏡像平鋪 - ComposeShader(混合渲染)
構造方法:
ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode) ComposeShader(ShadershaderA,Shader shaderB,Xfermodemode)
前兩個參數表示要混合的渲染模式,第三個參數表示疊加模式; - LinearGradient(線性渲染)
構造方法:LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile)
實現某一區域內顏色的線性漸變效果,x0,y0 表示漸變起始點的坐標,x1,y1 表示漸變終點的坐標,colors 表示漸變的顏色,positions 表示顏色數組的相對位置,tile 表示平鋪模式; - RadialGradient(環形渲染)
構造方法:RadialGradient (float x, float y, float radius, int[] colors, float[] positions, Shader.TileMode tile)
- SweepGradient(掃描渲染)
構造方法:SweepGradient (float cx, float cy, int[] colors, float[] positions)
#####setShadowLayer(float radius, float dx, float dy, int color)
設置陰影,第一個參數為模糊半徑,第二個參數為陰影離開文字的橫向距離,第三個參數為陰影離開文字的縱向距離,第四個參數表示陰影顏色
#####setXfermode(Xfermode xfermode)
設置圖形重疊時的顯示方式,XferMode 有三個子類:
- AvoidXfermode:已過時;
- PixelXorXfermode:已過時;
- PorterDuffXfermode:構造方法:`PorterDuffXfermode(PorterDuff.Modemode)`
傳入的參數是 PorterDuff.Mode 類的枚舉值,共有18種取值

1. PorterDuff.Mode.CLEAR:所繪制不會提交到畫布上;
2. PorterDuff.Mode.SRC: 顯示上層繪制圖片;
3. PorterDuff.Mode.DST:顯示下層繪制圖片;
4. PorterDuff.Mode.SRC_OVER:正常繪制顯示,上層居上;
5. PorterDuff.Mode.DST_OVER:正常繪制顯示,下層居上;
6. PorterDuff.Mode.SRC_IN: 取兩層繪制交集,顯示上層;
7. PorterDuff.Mode.DST_IN: 取兩層繪制交集,顯示下層;
8. PorterDuff.Mode.SRC_OUT:取上層繪制非交集部分;
9. PorterDuff.Mode.DST_OUT:取下層繪制非交集部分;
10. PorterDuff.Mode.SRC_ATOP:取下層非交集部分和上層交集部分;
11. PorterDuff.Mode.DST_ATOP:取上層非交集部分和下層交集部分;
12. PorterDuff.Mode.XOR:取上下層非交集部分;
13. PorterDuff.Mode.DARKEN:
14. PorterDuff.Mode.LIGHTEN:
15. PorterDuff.Mode.MULTIPLY:
16. PorterDuff.Mode.SCREEN:
17. PorterDuff.Mode.OVERLAY:
18. PorterDuff.Mode.ADD: