Android 基礎之 Paint 方法概覽

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種取值

![PorterDuff.Mode](http://upload-images.jianshu.io/upload_images/200711-5107ad6e65d913f2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
 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:






最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容

  • 系列文章之 Android中自定義View(一)系列文章之 Android中自定義View(二)系列文章之 And...
    YoungerDev閱讀 2,197評論 0 4
  • 轉載請標明出處:http://www.aiuxian.com/article/p-1982467.html 接下來...
    lucky_yaya閱讀 6,829評論 3 9
  • 假期很快就到了尾聲,尚舞一直窩在家,她的父親是政府員工,母親是自由職業者,開了一個咖啡屋,想營業就營業隨時可以閉店...
    WANGpolar閱讀 265評論 0 0
  • 白天上班的時候找好要畫什么,晚上吃完飯就開始畫,到十一點才結束。打算跟著鈴鐺老師學素描。只要我相信我能畫好...
    Cherry怡閱讀 206評論 2 0
  • 1. 如果你坐火車去烏魯木齊,不坐高鐵的話,過了蘭州后會經過一段非常長的隧道——烏鞘嶺隧道。我要講的就是這里的故事...
    初秋微雨閱讀 1,279評論 0 1