自定义View有着极大的灵活性,只要敢想总能画出来。既然是画,总是需要工具,那就是所熟悉的的画笔 - Paint。俗话说,工欲善其事必先利其器。接下来,将从Paint的一些列API来认识它。
构造函数
在官方API中,为我们提供了3个构造函数:
- Paint()
- Paint(int flags)
Paint(Paint paint)
val paintRed = Paint() paintRed.apply { color = resources.getColor(android.R.color.holo_red_A<sub>dst</sub>rk) // 绘制时可以实现抗锯齿 flags = Paint.ANTI_ALIAS_FLAG // 设置笔触:以路径结束,并不会超过它 strokeCap = Paint.Cap.BUTT // 画笔的样式:只绘画轮廓 style = Paint.Style.STROKE // 设置画笔宽度 strokeWidth = 36F } val paintBlue = Paint(Paint.ANTI_ALIAS_FLAG) paintBlue.apply { color = resources.getColor(android.R.color.holo_blue_A<sub>dst</sub>rk) strokeCap = Paint.Cap.BUTT strokeWidth = 36F } val paintRed_ = Paint(paintRed)
在上述示例代码中:
- paintRed由默认构造方法创建
paintBlue在创建时传递了Paint.ANTI_ALIAS_FLAG标志位。如果有需要可以同时传递多个标志位
val paintBlue = Paint(Paint.ANTI_ALIAS_FLAG or Paint.DEV_KERN_TEXT_FLAG)
- paintRed_是一个新的Paint,但是在创建时,使用了Paint的属性进行初始化。
常用API
- reset():重置画笔为默认设置
- setAntiAlias(boolean aa):设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢
- setDither(boolean dither):设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰
- setFilterBitmap(boolean filter):如果该项设置为true加快显示速度,本设置项依赖于dither和xfermode的设置
- setLinearText(boolean linearText):使文本平滑线性缩放
- setElegantTextHeight(boolean elegant):在Android TextView What does elegantTextHeight do? (API 21)中这么解释:这是一种关闭某些语言的“字体压缩”优化的方法。 如果你不知道我在说什么,那可能是因为你的语言没有“字体压缩”优化,这意味着你不需要关心它。
- setHinting (int mode):设置Paint的提示模式, HINTING_OFF 或 HINTING_ON
Flag
在Paint中定义了一系列的标志位,以便Paint可以显示某些特性,或者对Paint的效果。比如,我们常设置的抗锯齿特性,就可以使用ANTI_ALIAS_FLAG来设置。下面列出了常用的Flag.
- ANTI_ALIAS_FLAG:绘制时可以实现抗锯齿
- DITHER_FLAG:使位图进行有利的抖动
- EMBEDDED_BITMAP_TEXT_FLAG:可以在绘制文本时使用位图字体
- FAKE_BOLD_TEXT_FLAG:绘制文本应用合成加粗效果
- FILTER_BITMAP_FLAG:可在缩放位图上实现双线性采样
- LINEAR_TEXT_FLAG:使文本能够平滑线性缩放
- STRIKE_THRU_TEXT_FLAG:使用透油装饰绘制文本
- SUBPIXEL_TEXT_FLAG:使文本的子像素定位
- UNDERLINE_TEXT_FLAG:绘制文本下划线
如果要FLAG,可以通过调用构造函数 - Paint(int flags),在创建Paint实例时就设置标志位。比如:
val paint = Paint(Paint.ANTI_ALIAS_FLAG)
在创建paint时,就给定了标志位 - ANTI_ALIAS_FLAG,那么在绘制时,可以实现抗锯齿。
也可以调用setFlags(int flags)方法设置标志位:
paint.setFlags(Paint.ANTI_ALIAS_FLAG)
Paint.Cap
Paint.Cap是一个枚举,其指定了针对线条和路径的开始和结束的处理方式。官方的解释有点难懂,容易理解的就是画笔笔触的样式,所谓笔触就是笔与画布接触的部分。比如,平时使用的铅笔,写字时习惯削成圆角,画出来线的两端是圆形;为了方便涂选择的答题卡,又将笔尖削成扁平的长方形,那画出来的线条的两端就是矩形,正好填充答案部分。其默认值为BUTT。
- BUTT:以指定返回坐标的路径开始和结束,不会超出给定的坐标范围
- ROUND:笔触是半圆形的,其中心为路径的结束位置。轨迹会超过给定的坐标范围
- SQUARE:笔触为方形,其中心为路径的结束位置。轨迹会超过给定的坐标范围
仔细看效果图,笔触不管是半圆形的还是方形的,其超出的坐标范围的大小与画笔的宽度有关系,都是画笔的宽度的一半。
Paint.Join
Join指定线条和曲线在描边路径的处理方式。默认值为MITER。
- BEVEL:连接的外缘以直线相交
- MITER:连接的外缘以锐角相交
- ROUND:连接的外缘以圆弧相交
Paint.Style
Style指定画笔绘制图形时的样式:只绘制图形轮廓(描边),只绘制图形内容 或者既绘制轮廓也绘制内容
- STROKE:只绘制图形轮廓(描边)
- FILL:只绘制图形内容,不绘制轮廓
- FILL_AND_STROKE:既绘制轮廓也绘制内容
当绘制轮廓时,笔触的中心当前绘制的位置,其中SROKE和FILL效果图有鲜明的对比。
Paint. Align
见文本之setTextAlign
Color
画笔的默认颜色是黑色,这并不是我们想要的颜色。在自定义View时,View的颜色各异。就像前面的例子那样,总是不断指定不同的画笔的颜色。如果想指定颜色可以调用这些方法:
- setARGB(int a, int r, int g, int b):设置绘制的颜色,a代表透明度,r,g,b代表颜色值。
- setColor(int color):设置绘制的颜色,使用颜色值来表示,该颜色值包括透明度和RGB颜色
- setAlpha(int a):设置绘制图形的透明度
例如:
val paintDefault = Paint()
// Color
val paintRed = Paint(Paint.ANTI_ALIAS_FLAG)
paintRed.color = resources.getColor(android.R.color.holo_red_A<sub>dst</sub>rk)
// Alpha
val paintAlpha = Paint(paintRed)
paintAlpha.alpha = 80
// ARGB
val paintArgb = Paint(Paint.ANTI_ALIAS_FLAG)
paintArgb.setARGB(255, 128, 0, 128)
在示例中:
- paintDefault的颜色默认的,即黑色
- paintRed的颜色通过setColor设置为红色,但未设置透明度
- paintAlpha是基于paintRed创建的,不同的是,其将透明度设置为80
- paintArgb通过ARGB设置颜色
如果对于透明度换算不熟悉的,可参考Android 颜色透明度换算
若想了解更多Paint相关的内容,请跳入: 自定义View系列文章目录
如果觉得我的文章对您有用,请随意点赞、评论。您的支持将鼓励我继续创作!
本文详细介绍了自定义View中Paint类的重要API,包括构造函数、常用方法如设置抗锯齿、抖动处理等,以及Flag、Cap、Join、Style和Align等属性的用法。通过对这些特性的理解,开发者可以更好地掌握自定义View的绘图控制。
609

被折叠的 条评论
为什么被折叠?



