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阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容

  • 系列文章之 Android中自定义View(一)系列文章之 Android中自定义View(二)系列文章之 And...
    YoungerDev阅读 2,152评论 0 4
  • 转载请标明出处:http://www.aiuxian.com/article/p-1982467.html 接下来...
    lucky_yaya阅读 6,714评论 3 9
  • 假期很快就到了尾声,尚舞一直窝在家,她的父亲是政府员工,母亲是自由职业者,开了一个咖啡屋,想营业就营业随时可以闭店...
    WANGpolar阅读 256评论 0 0
  • 白天上班的时候找好要画什么,晚上吃完饭就开始画,到十一点才结束。打算跟着铃铛老师学素描。只要我相信我能画好...
    Cherry怡阅读 201评论 2 0
  • 1. 如果你坐火车去乌鲁木齐,不坐高铁的话,过了兰州后会经过一段非常长的隧道——乌鞘岭隧道。我要讲的就是这里的故事...
    初秋微雨阅读 1,247评论 0 1