Android 基礎(chǔ)之 Paint 方法概覽

Paint 類持有繪制圖形、文本、圖像的樣式和色彩信息,并且對外提供了一系列方法來設(shè)置這些信息。

一、畫筆基本操作

set(Paint src)

直接把另一個(gè)畫筆的屬性復(fù)制給當(dāng)前畫筆

reset()

恢復(fù)畫筆屬性為默認(rèn)配置

setAntiAlias(boolean aa)

設(shè)置是否開啟抗鋸齒,一般在繪制棱角分明的圖形比如矩形,位圖時(shí)不需要開啟

setDither(boolean dither)

設(shè)置是否開啟圖像抖動處理,會使繪制出來的圖像顏色更加平滑飽滿,更加清晰

setFlags(int flags)

設(shè)置一些標(biāo)識,抗鋸齒,防抖動等

二、畫筆顏色和樣式

setAlpha(int a)
setARGB(int a,int r,int g,int b)
setColor(int color))
setStyle(Paint.Style style)

設(shè)置畫筆樣式,有三種取值:

  • Paint.Style.FILL:填充;
  • Paint.Style.FILL_AND_STROKE:填充和描邊;
  • PaintStyle.STROKE:描邊
setStokeWidth(float width)

設(shè)置畫筆寬度

setStrokeCap(Paint.Cap cap)

設(shè)置畫筆筆觸風(fēng)格,當(dāng)畫筆樣式為 Style.STROKE 時(shí)影響畫筆始末端,有三種取值:

  • Paint.Cap.BUTT:無風(fēng)格;
  • Paint.Cap.ROUND:半圓形;
  • Paint.Cap.SQUARE:方形
setStrokeJoin(Paint.Join join)

設(shè)置圖形連接點(diǎn)的結(jié)合方式,在畫矩形時(shí)會用到,三種取值:

  • Paint.Join.BEVEL:直線;
  • Paint.Join.MITER:角度;
  • Paint.Join.ROUND:圓?。?/li>
setStrokeMiter(float meter)

設(shè)置畫筆的傾斜度,取值大于0,大概是設(shè)置圖形銳角的樣式

三、文本相關(guān)操作

setTextAlign(Paint.Align align)

設(shè)置文本對齊方式,三種取值:

  • Paint.Align.LEFT:以基準(zhǔn)點(diǎn)左對齊;
  • Paint.Align.CENTER:以基準(zhǔn)點(diǎn)居中對齊;
  • Paint.Align.RIGHT:以基準(zhǔn)點(diǎn)右對齊;
setTextLocal(Local local)

設(shè)置地理位置,比如顯示中文、日文、韓文等,默認(rèn)顯示 Locale.getDefault() 即可

setTextScaleX (float scaleX)

設(shè)置文字水平方向的縮放因子,默認(rèn)為1.0,大于1.0拉伸文字寬度,小于1.0壓縮文字寬度

setTextSize(float textSize)

設(shè)置字體大小,必須大于0

setTextSkewX (float skewX)

設(shè)置文本在水平方向的傾斜,默認(rèn)值為0,推薦為0.25

setTypeface(Typeface typeface)

設(shè)置字體樣式,可以是 Typeface 類中的樣式:

  • Typeface.DEFAULT:默認(rèn)正常字體樣式;
  • Typeface.DEFAULT_BOLD:默認(rèn)粗體樣式;
  • Typeface.MONOSPACE:等寬字體;
  • Typeface.SANS_SERIF:非襯線字體;
  • Typeface.SERIF:襯線字體;

也可以用 Typeface.createFromAsset(AssetManager mgr, String path) 方法從 assets 目錄中加載字體

setElegantTextHeight(boolean elegant)

設(shè)置優(yōu)雅的文字高度,這個(gè)設(shè)置可能會對 FontMetrics 產(chǎn)生影響

setLetterSpacing(float letterSpacing)

設(shè)置行的間距,默認(rèn)值是0,負(fù)值行間距會收縮

setFontFeatureSettings(String settings)

設(shè)置字體樣式,可以設(shè)置 CSS 樣式

setFakeBoldText (boolean fakeBoldText)

設(shè)置字體樣式,可以設(shè)置 CSS 樣式

setLinearText(boolean linearText)

設(shè)置是否打開線性文本標(biāo)識,設(shè)置為 true 表示不需要文本緩存

setSubpixelText(boolean subpixelText)

設(shè)置亞像素,是對文本的一種優(yōu)化設(shè)置,可以讓文字看起來更加清晰明顯,有助于文本在 LCD 屏幕上的顯示效果

setUnderlineText(boolean underlineText)

設(shè)置文本的下劃線

setStrikeThruText(boolean strikeThruText)

設(shè)置文本的刪除線

setHinting(int mode)

設(shè)置畫筆隱藏模式,可以為 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 時(shí)截取指定長度顯示
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)
獲取指定范圍內(nèi)的字符寬度,保存到 widths 數(shù)組中
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 中,可以通過這計(jì)算文本寬高
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 類有五個(gè)屬性:

  • ascent:字符最高處到基準(zhǔn)線的距離,負(fù)值;
  • descent:字符最低處到基準(zhǔn)線的距離;
  • top:最高字符到基準(zhǔn)線的距離;
  • bottom:最低字符到基準(zhǔn)線的距離;
  • lending:上一行字符的 descent 到下一行字符的 ascent 的距離

五、圖像顏色的相關(guān)操作

setFilterBitmap(boolean filter)

對位圖進(jìn)行濾波處理,如果該項(xiàng)設(shè)置為 true,則圖像在動畫進(jìn)行中會濾掉對 Bitmap 圖像的優(yōu)化操作,加快顯示

setColorFilter(ColorFilter filter)

設(shè)置顏色過濾,參數(shù)可以是 ColorMatrixColorFilter、LightingColorFilter 和 PorterDuffColorFilter 三個(gè)類的子類,它們都是 ColorFilter 類的子類

  • ColorMatrixColorFilter(色彩矩陣顏色過濾器)
    構(gòu)造函數(shù):
    ColorMatrixColorFilter(ColorMatrixmatrix) ColorMatrixColorFilter (float[] array)
    在構(gòu)造函數(shù)中傳入 ColorMatrix 參數(shù),通過色彩矩陣 ColorMatrix 對象來改變顏色,該類是一個(gè) 4 x 5 的矩陣:
ColorMatrix colorMatrix = new ColorMatrix(new float[]{  
                1, 0, 0, 0, 0,  // 紅色向量
                0, 1, 0, 0, 0,  // 綠色向量
                0, 0, 1, 0, 0,  // 藍(lán)色向量
                0, 0, 0, 1, 0,  // 透明度向量
        }); 

矩陣的第一行表示 R 向量,第二行表示 G 向量,第三行表示 B 向量,第四行表示 A 向量,每一行的第一個(gè)元素表示 R 值,第二個(gè)元素表示 G 值,第三個(gè)元素表示 B 值,第四個(gè)元素表示 A 值,其取值范圍為 0.0f ~ 2.0f,1.0f 表示保持原圖 RGB 值,第五個(gè)元素表示偏移值,我們想讓圖片更偏向于哪個(gè)顏色,就增大哪個(gè)向量的偏移值。


色彩矩陣顏色過濾器的計(jì)算
  • LightingColorFilter(光照顏色過濾)
    該類構(gòu)造方法只有一個(gè) LightingColorFilter (int mul, int add)
    第一個(gè)參數(shù) mul 全稱是 colorMultiply,意為色彩倍增,第二個(gè)參數(shù) add 全稱 colorAdd,意為色彩添加,這兩個(gè)值都是十六進(jìn)制的色彩值 0xAARRGGBB,當(dāng) mul 是 0xFFFFFFFF,add 是 0x00000000 時(shí)原圖不會有任何改變,如果想要減少 A、R、G、B 某一顏色值,就把 mul 參數(shù)對應(yīng)的位數(shù)減小,如果想增加某一顏色值,就把 add 參數(shù)對應(yīng)的位數(shù)增加,取值范圍為 00 ~ FF
  • PorterDuffColorFilter
    該類只有一個(gè)構(gòu)造函數(shù) PorterDuffColorFilter(int color,PorterDuff.Modemode)
    第二個(gè)參數(shù)是 PorterDuff.Mode 類中的常量值,表示混合模式,要混合的兩種顏色,一個(gè)是第一個(gè)參數(shù)所設(shè)定的十六進(jìn)制色彩值,另一個(gè)顏色就是畫布上的元素,兩種顏色根據(jù)混合模式進(jìn)行混合產(chǎn)生最終的結(jié)果。
    PorterDuff.Mode 中的混合模式不僅應(yīng)用于圖像色彩混合,還應(yīng)用于圖形混合,后面再具體看。
setMaskFilter(MaskFilter maskFilter)

設(shè)置濾鏡效果,需要傳入一個(gè) MaskFilter 參數(shù),MaskFilter 有兩個(gè)子類:

  • BlurMaskFilter:模糊遮罩濾鏡
    該類只有一個(gè)構(gòu)造函數(shù):BlurMaskFilter(float radius,BlurMaskFilter.Blurstyle)
    第一個(gè)參數(shù)表示陰影范圍,第二個(gè)參數(shù)是 BlurMaskFilter.Blur 的枚舉值,表示模糊類型,有四種取值:

  • Blur.NORMAL:將整個(gè)圖像模糊掉;

  • Blur.SOLID:在圖像的邊界外產(chǎn)生一層與 Paint 顏色一致的陰影效果而不影響圖像本身;

  • Blur.INNER:在圖像內(nèi)部產(chǎn)生陰影效果,與 Blur.SOLID 效果相反;

  • Blur.OUTER:在圖像邊界外產(chǎn)生一層陰影效果,與 blur.SOLD 不同的是圖像會變透明;
    BlurMaskFilter 是根據(jù) Alpha 通道的邊界來計(jì)算模糊的,如果用它對圖片進(jìn)行處理,沒有任何效果。如果想給圖片一個(gè)類似陰影的效果,可以用 Bitmap#extractAlpha() 方法獲取位圖的 Alpha 通道圖,在繪制位圖前先給 Alpha 通道圖繪制一個(gè)模糊效果。

  • EmbossMaskFilter:浮雕遮罩濾鏡
    構(gòu)造函數(shù):EmbossMaskFilter (float[] direction, float ambient, float specular, float blurRadius)

setPathEffect(PathEffect effect)

設(shè)置繪制路徑的效果,PathEffect 類有六個(gè)子類:

  • CornerPathEffect:將路徑的轉(zhuǎn)角變得圓滑,該類的構(gòu)造函數(shù)只有一個(gè)參數(shù) radius,表示轉(zhuǎn)角處的圓滑程度;
  • DiscretePathEffect:會在路徑上繪制很多“雜點(diǎn)”的突出來模擬一種類似生銹鐵絲的效果,其構(gòu)造方法有兩個(gè)參數(shù),第一個(gè)表示雜點(diǎn)的密度,值越小雜點(diǎn)越密集,第二個(gè)參數(shù)表示雜點(diǎn)突出的大小,值越大突出的距離越大;
  • DashPathEffect:主要用于畫虛線,第一個(gè)參數(shù)是一個(gè) float 數(shù)組,元素個(gè)數(shù)必須大于等于2,奇數(shù)元素表示線段長度,偶數(shù)元素表示間隔長度,第二個(gè)參數(shù)表示偏移值;
  • PathDashPathEffect:類似于 DashPathEffect,不同的是可以自定義路徑虛線的樣式
    構(gòu)造函數(shù) publicPathDashPathEffect(Pathshape, float advance, float phase,PathDashPathEffect.Stylestyle)
    第一個(gè)參數(shù)通過一個(gè) Path 定義虛線的形狀,第四個(gè)參數(shù)是一個(gè)枚舉值,有 MORPH、ROTATE、TRANSLATE 三種取值;
  • ComposePathEffect 和 SumPathEffect:組合兩種路徑效果
setShader(Shader shader)

設(shè)置著色器,Shader 類有五個(gè)子類:

  • BitmapShader(圖像渲染)
    構(gòu)造方法:BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)
    第一個(gè)參數(shù) bitmap 表示用于填充的位圖,第二、三個(gè)參數(shù) tileX、tileY 分別表示 x、y 方向的平鋪模式,取自 Shader 內(nèi)部的 TileMode 枚舉值,TileMode.CLAMP 表示拉伸邊緣,TileMode.REPEAT 表示重復(fù),TileMode.MIRROR 表示鏡像平鋪
  • ComposeShader(混合渲染)
    構(gòu)造方法:
    ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode) ComposeShader(ShadershaderA,Shader shaderB,Xfermodemode)
    前兩個(gè)參數(shù)表示要混合的渲染模式,第三個(gè)參數(shù)表示疊加模式;
  • LinearGradient(線性渲染)
    構(gòu)造方法:LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile)
    實(shí)現(xiàn)某一區(qū)域內(nèi)顏色的線性漸變效果,x0,y0 表示漸變起始點(diǎn)的坐標(biāo),x1,y1 表示漸變終點(diǎn)的坐標(biāo),colors 表示漸變的顏色,positions 表示顏色數(shù)組的相對位置,tile 表示平鋪模式;
  • RadialGradient(環(huán)形渲染)
    構(gòu)造方法:RadialGradient (float x, float y, float radius, int[] colors, float[] positions, Shader.TileMode tile)
  • SweepGradient(掃描渲染)
    構(gòu)造方法:SweepGradient (float cx, float cy, int[] colors, float[] positions)
#####setShadowLayer(float radius, float dx, float dy, int color)
設(shè)置陰影,第一個(gè)參數(shù)為模糊半徑,第二個(gè)參數(shù)為陰影離開文字的橫向距離,第三個(gè)參數(shù)為陰影離開文字的縱向距離,第四個(gè)參數(shù)表示陰影顏色
#####setXfermode(Xfermode xfermode)
設(shè)置圖形重疊時(shí)的顯示方式,XferMode 有三個(gè)子類:
- AvoidXfermode:已過時(shí);
- PixelXorXfermode:已過時(shí);
- PorterDuffXfermode:構(gòu)造方法:`PorterDuffXfermode(PorterDuff.Modemode)`
傳入的參數(shù)是 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:






最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容