Paint即画笔,用于设置绘制风格,如:线宽(笔触粗细),颜色,透明度和填充风格等,
大体上可以分为两类,一类与图形绘制相关,一类与文本绘制相关。
1.图形绘制
setARGB(int a,int r,int g,int b) | 设置绘制的颜色,a代表透明度,r,g,b代表颜色值 | 这个不多说了,还有两个类似的方法,将设置alpha和rgb分割开来了。注意的是这里的a值是0~255的范围,不是小数。 |
setAlpha(int a ) | 设置绘制图形的透明度 | |
setColor(int color) | 设置绘制的颜色,使用颜色值来表示,该颜色值包括透明度和RGB颜色。 | |
setAntiAlias(boolean aa ) | 设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢。 | |
setDither(boolean dither) | 设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰 | |
setFilterBitmap(boolean filter) | 如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示速度,本设置项依赖于dither 和xfermode 的设置 | |
setMaskFilter(MaskFilter maskfilter) | 设置MaskFilter ,可以用不同的MaskFilter 实现滤镜的效果,如滤化,立体等 | MaskFilter 介绍 |
setColorFilter(ColorFilter colorfilter) | 设置颜色过滤器,可以在绘制颜色时实现不用颜色的变换效果 | 这个方法也值得试验一下:MaskFilter 是对一个Paint 的alpha 通道的转换,而ColorFilter 则是对每一个RGB通道应用转换。所有由ColorFilter 所派生的类在执行它们的转换时,都会忽略alpha 通道。这个貌似比较麻烦,改天再说 |
setPathEffect(PathEffect effect) | 设置绘制路径的效果,如点画线等 | 又是一个很好玩的方法:到目前为止,所有的效应都会影响到Paint填充图像的方式;PathEffect 是用来控制绘制轮廓(线条)的方式。PathEffect对于绘制Path基本图形特别有用,但是它们也可以应用到任何Paint 中从而影响线条绘制的方式。使用PathEffect,可以改变一个形状的边角的外观并且控制轮廓的外表。Android包含了多个PathEffect ,包括:1)CornerPathEffect 可以使用圆角来代替尖锐的角从而对基本图形的形状尖锐的边角进行平滑。2)DashPathEffect 可以使用DashPathEffect 来创建一个虚线的轮廓(短横线/小圆点),而不是使用实线。你还可以指定任意的虚/实线段的重复模式。3) DiscretePathEffect 与DashPathEffect 相似,但是添加了随机性。当绘制它的时候,需要指定每一段的长度和与原始路径的偏离度。4)PathDashPathEffect 这种效果可以定义一个新的形状(路径)并将其用作原始路径的轮廓标记。下面的效果可以在一个Paint中组合使用多个PathEffect 。1)SumPathEffect 顺序地在一条路径中添加两种效果,这样每一种效果都可以应用到原始路径中,而且两种结果可以结合起来。2)ComposePathEffect 将两种效果组合起来应用,先使用第一种效果,然后在这种效果的基础上应用第二种效果。对象形状的PathEffect 的改变会影响到形状的区域。这就能够保证应用到相同形状的填充效果将会绘制到新的边界中。使用setPathEffect 方法可以把PathEffect应用到Paint对象中,如下所示:1 paint.setPathEffect(new CornerPathEffect(10)) ;其他效果懒得测试了,这个在模拟器上跑的时候效果也不明显,但是真机上跑的时候的确圆滑了许多,看上去很舒服 |
setShader(Shader shader) | 设置图像效果,使用Shader可以绘制出各种渐变效果 | |
setShadowLayer(float radius ,float dx,float dy,int color) | 在图形下面设置阴影层,产生阴影效果 | radius 为阴影的角度,dx 和dy 为阴影在x轴和y轴上的距离,color 为阴影的颜色 |
setStyle(Paint.Style style) | 设置画笔的样式,为FILL,FILL_OR_STROKE,或STROKE | |
setStrokeCap(Paint.Cap cap) | 当画笔样式为STROKE 或FILL_OR_STROKE 时,设置笔刷的图形样式,如圆形样式Cap.ROUND ,或方形样式Cap.SQUARE | |
setSrokeJoin(Paint.Join join) | 设置绘制时各图形的结合方式,如平滑效果等 | |
setStrokeWidth(float width) | 当画笔样式为STROKE 或FILL_OR_STROKE 时,设置笔刷的粗细度 ,单位为px | |
setXfermode(Xfermode xfermode) | 设置图形重叠时的处理方式,如合并,取交集或并集,经常用来制作橡皮的擦除效果 | Xfermode 介绍 |
2.文字绘制
setFakeBoldText(boolean fakeBoldText) | 模拟实现粗体文字,设置在小字体上效果会非常差 | |
setSubpixelText(boolean subpixelText) | 设置该项为true ,将有助于文本在LCD屏幕上的显示效果 | |
setTextAlign(Paint.Align align) | 设置绘制文字的对齐方向 | |
setTextScaleX(float scaleX) | 设置绘制文字x轴的缩放比例,可以实现文字的拉伸的效果 | |
setTextSize(float textSize) | 设置绘制文字的字号大小,单位为px | |
setTextSkewX(float skewX) | 设置斜体文字,skewX为倾斜弧度 | |
setTypeface(Typeface typeface) | 设置Typeface 对象,即字体风格,包括粗体,斜体以及衬线体,非衬线体等 | |
setUnderlineText(boolean underlineText) | 设置带有下划线的文字效果 | |
setStrikeThruText(boolean strikeThruText) | 设置带有删除线的效果 |
嵌套类
- Paint.Align ,设置字符位置,字符以坐标(x,y)为源点。
- Paint.Cap,线段断点形状(默认Paint.Cap.BUTT):
- Paint.FontMetrics,字体属性及测量。
如需详细了解,请参考:
Paint—FontMetrics - qq_20198405的博客 - 博客频道 - CSDN.NET - Paint.FontMetricsInt
- Paint.Join,设置结合处的样子。
- Paint.Style,设置空心(默认Paint.Style.FILL);
常量
标记 | 说明 |
---|---|
ANTI_ALIAS_FLAG | 抗锯齿的标志 |
DEV_KERN_TEXT_FLAG | |
DITHER_FLAG | 使位图进行有利的抖动的位掩码标志 |
FAKE_BOLD_TEXT_FLAG | 文本仿粗体的标志 |
FILTER_BITMAP_FLAG | 使位图过滤的位掩码标志 |
HINTING_OFF | |
HINTING_ON | |
LINEAR_TEXT_FLAG | |
STRIKE_THRU_TEXT_FLAG | 文本删除线的标志 |
SUBPIXEL_TEXT_FLAG | |
UNDERLINE_TEXT_FLAG | 文字的下划线的标志 |
构造方法
Paint的构造方法有两种:
Paint():
Paint(int flags):
Paint(Paint paint):
setXXX()方法族:
- set(Paint src):
为当前画笔设置一个画笔,说白了就是把另一个画笔的属性设置Copy给我们的画笔。 - setARGB(int a, int r, int g, int b):
设置绘制的颜色,a代表透明度,r,g,b代表颜色值。 - setAlpha(int a):
设置绘制图形的透明度,设置范围是[0..255]。 - setAntiAlias(boolean aa):
消除锯齿(默认不消除锯齿)。
不消除锯齿:
消除锯齿:
- setColor(int color):
设置画笔颜色。 setColorFilter(ColorFilter filter):
设置颜色过滤,这个方法需要我们传入一个ColorFilter参数同样也会返回一个ColorFilter实例。 如需详细了解,请参考:
Paint—ColorFilter - qq_20198405的博客 - 博客频道 - CSDN.NETsetDither(boolean dither):
设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰
这玩意用来设置我们在绘制图像时的抗抖动,也称为递色,那什么叫抗抖动呢?在Android中我确实不好拿出一个明显的例子,我就在PS里模拟说明一下:
大家看到的这张七彩渐变图是一张RGB565模式下图片,即便图片不是很大我们依然可以很清晰地看到在两种颜色交接的地方有一些色块之类的东西感觉很不柔和,因为在RGB模式下只能显示2^16=65535种色彩,因此很多丰富的色彩变化无法呈现,而Android呢为我们提供了抗抖动这么一个方法,它会将相邻像素之间颜色值进行一种“中和”以呈现一个更细腻的过渡色:
放大来看,其在很多相邻像素之间插入了一个“中间值”:
抗抖动不是Android的专利,是图形图像领域的一种解决位图精度的技术。- setFakeBoldText(boolean fakeBoldText):
设置文本仿粗体。注意设置在小字体上效果会非常差。 - setFilterBitmap(boolean filter):
如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示速度,本设置项依赖于dither和xfermode的设置。 - setFlags(int flags):
设置标志,还是对paint进行样式的设置。比如
// 实例化画笔并打开抗锯齿
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- setHinting(int mode):
设置画笔的隐藏模式。可以是HINTING_OFF
orHINTING_ON
之一。 - setLinearText(boolean linearText):
设置是否打开线性文本标识,这玩意对大多数人来说都很奇怪不知道这玩意什么意思。想要明白这东西你要先知道文本在Android中是如何进行存储和计算的。在Android中文本的绘制需要使用一个bitmap作为单个字符的缓存,既然是缓存必定要使用一定的空间,我们可以通过setLinearText (true)告诉Android我们不需要这样的文本缓存。 setMaskFilter(MaskFilter maskfilter):
这个方法可以用来对图像进行一定的处理,实现滤镜的效果,如滤化,立体等。 如需详细了解,请参考:
Paint—MaskFilter(面具) - qq_20198405的博客 - 博客频道 - CSDN.NETsetPathEffect(PathEffect effect):设置绘制路径时的路径效果(ComposePathEffect, CornerPathEffect, DashPathEffect, DiscretePathEffect, PathDashPathEffect, SumPathEffect),如点画线等 。 如需详细了解,请参考:
Paint—PathEffect(路径效果) - qq_20198405的博客 - 博客频道 - CSDN.NET- setRasterizer(Rasterizer rasterizer):
设置光栅,光栅这东西涉及太多太多物理知识。该方法同样不支持HW在API 21中被遗弃了,所以不推荐使用。 - setShader(Shader shader):
设置画笔的填充效果(BitmapShader, ComposeShader, LinearGradient, RadialGradient, SweepGradient),使用Shader可以绘制出各种渐变效果。如需详细了解,请参考:
Paint—Shader - qq_20198405的博客 - 博客频道 - CSDN.NET - setShadowLayer(float radius, float dx, float dy, int color):
radius表示阴影的扩散半径;dx和dy表示阴影平面上的偏移值;shadowColor就不说了阴影颜色。
注意: 这个方法不支持硬件加速,所以我们要测试时必须先关闭硬件加速。 - setStrikeThruText(boolean strikeThruText):
设置文本删除线。 - setStrokeCap(Paint.Cap cap):
设置线段断点形状(默认Paint.Cap.BUTT)
Paint.Cap.BUTT : 不多不少
Paint.Cap.ROUND : 多了一个圆头
Paint.Cap.SQUARE:多了一个方头
- setStrokeJoin(Paint.Join join):
设置画笔转弯处的连接风格(BEVEL-直线、MITER -锐角、ROUND-圆弧 )。 - setStrokeMiter(float miter):
设置画笔倾斜度。 - setStrokeWidth(float width):
当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度。 - setStyle(Paint.Style style):
设置空心(默认Paint.Style.FILL)
Paint.Style.FILL :填充内部
Paint.Style.STROKE :仅描边
Paint.Style.FILL_AND_STROKE :填充内部和描边
再来一张更详细的图:
- setSubpixelText(boolean subpixelText):
设置自像素。如果该项为true,将有助于文本在LCD屏幕上的显示效果。 - setTextAlign(Paint.Align align):
设置字符位置,字符以坐标(x,y)为源点。
center表示字符在水平方向上以x中心向左右两边延伸,在垂直方向以y为起点向下延伸;
left表示字符在水平方向上以x为起点向右延伸,在垂直方向上以y为起点向下延伸;
right表示字符在水平方向上以x为起点向左延伸,在垂直方向上以y为起点向下延伸。
- setTextLocale(Locale locale):
设置地理位置,这里如果你要使用,直接传入Locale.getDefault()即可。它用来设置文本的区域比如中文、日文等。 - setTextScaleX(float scaleX):
设置绘制文字x轴的缩放比例,可以实现文字的拉伸的效果。 - setTextSize(float textSize):
设置绘制文字的字号大小。 - setTextSkewX(float skewX):
设置斜体文字,skewX为倾斜弧度。这个倾斜值没有具体的范围,但是官方推崇的值为-0.25可以得到比较好的倾斜文本效果,值为负右倾值为正左倾,默认值为0。 - setTypeface(Typeface typeface):
设置字体类型和样式,上面我们也使用过,Android中字体有四种样式:BOLD
(加粗),BOLD_ITALIC
(加粗并倾斜),ITALIC
(倾斜),NORMAL
(正常);而其为我们提供的字体有五种:DEFAULT
,DEFAULT_BOLD
,MONOSPACE
,SANS_SERIF
和SERIF
,这些什么类型啊、字体啊之类的都很简单大家自己去试试就知道就不多说了。 如需详细了解,请参考:
Paint—Typeface - qq_20198405的博客 - 博客频道 - CSDN.NET - setUnderlineText(boolean underlineText):
设置文字的下划线。 - setXfermode(Xfermode xfermode):
设置图像的混合模式,详细使用方式请参考:
Paint—PorterDuffXfermode - qq_20198405的博客 - 博客频道 - CSDN.NET
Paint—Xfermode、 PixelXorXfermode - qq_20198405的博客 - 博客频道 - CSDN.NET
getXXX()方法族:
- getAlpha()
- getColor()
- getColorFilter()
- getFillPath(Path src, Path dst)
- getFlags()
- getFontMetrics(Paint.FontMetrics metrics):
这个和我们之前用到的getFontMetrics()相比多了个参数,getFontMetrics()返回的是FontMetrics对象,而getFontMetrics(Paint.FontMetrics metrics)返回的是文本的行间距,如果metrics的值不为空则返回FontMetrics对象的值。 - getFontMetrics():得到一个FontMetrics对象,返回对象中的参数都是float。
- getFontMetricsInt():返回对象中的参数都是int。
- getFontMetricsInt(Paint.FontMetricsInt fmi)
- getFontSpacing():返回字符行间距。
- getHinting()
- getMaskFilter()
- getPathEffect()
- getRasterizer()
- getShader()
- getStrokeCap()
- getStrokeJoin()
- getStrokeMiter()
- getStrokeWidth()
- getStyle()
- getTextAlign()
- getTextBounds(char[] text, int index, int count, Rect bounds)
- getTextBounds(String text, int start, int end, Rect bounds)
- getTextLocale()
- getTextPath(String text, int start, int end, float x, float y, Path path)
- getTextPath(char[] text, int index, int count, float x, float y, Path path)
- getTextScaleX()
- getTextSize()
- getTextSkewX()
- getTextWidths(String text, float[] widths)
- getTextWidths(CharSequence text, int start, int end, float[] widths)
- getTextWidths(String text, int start, int end, float[] widths)
- getTextWidths(char[] text, int index, int count, float[] widths)
- getTypeface()
- getXfermode()
isXXX()方法族:
- isAntiAlias()
- isDither()
- isFakeBoldText()
- isFilterBitmap()
- isLinearText()
- isStrikeThruText()
- isSubpixelText()
- isUnderlineText()
其他方法:
- ascent():返回上坡度的值。
- descent():返回下坡度的值。
clearShadowLayer()
breakText(CharSequence text, int start, int end, boolean
measureForwards, float maxWidth, float[] measuredWidth)- breakText(String text, boolean measureForwards, float maxWidth,
float[] measuredWidth) breakText(char[] text, int index, int count, float maxWidth, float[]
measuredWidth)- 这三个方法让我们设置一个最大宽度,在不超过这个宽度的范围内返回实际测量值否则停止测量。
text 表示我们的字符串;
start 表示从第几个字符串开始测量;
end 表示从测量到第几个字符串为止;
measureForwards 表示向前还是向后测量;
maxWidth 表示一个给定的最大宽度在这个宽度内能测量出几个字符;
measuredWidth 为一个可选项,可以为空,不为空时返回真实的测量值
这些方法在一些结合文本处理的应用里比较常用,比如文本阅读器的翻页效果,我们需要在翻页的时候动态折断或生成一行字符串,这就派上用场了~
- measureText(String text)
- measureText(CharSequence text, int start, int end)
- measureText(String text, int start, int end)
- measureText(char[] text, int index, int count)
- 测量文本宽度,上面我们已经使用过了,这四个方法都是一样的只是参数稍有不同罢了。
- reset()::恢复画笔到默认配置。
引用:
Android画图Path的使用 - tt_mc - 博客园
(转)【Android】Paint的效果研究 - wpf814533631 - ITeye技术网站
自定义控件其实很简单1/4 - AigeStudio - 博客频道 - CSDN.NET
android paint cap join 理解 图示 - Android移动开发技术文章_手机开发 - 红黑联盟
android Graphics(一):概述及基本几何图形绘制 - harvic - 博客频道 - CSDN.NET
Android笔记二十八.Android绘图深度解析-android-爱编程
用TextPaint来绘制文字 - developer_Kale - 博客园