Paint 的 API 大致可以分为 4 类:
1.颜色
*1 setColor(int color)
*2 setARGB(int a, int r, int g, int b) 三原色(0-255)与透明度的值
*3 setShader(Shader shader) 设置 Shader
使用子类 (1) LinearGradient 线性渐变:
LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tileMode)。
参数:
x0 y0 x1 y1:渐变的两个端点的位置
color0 color1 是端点的颜色
tileMode:端点范围之外的着色规则,
CLAMP (夹子模式???算了这个词我不会翻)会在端点之外延续端点处的颜色;
MIRROR是镜像模式;
REPEAT 是重复模式。具体的看一下例子就明白。
(2)RadialGradient 辐射渐变 从中心向周围辐射状的渐变
RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, TileMode tileMode)。
centerX centerY:辐射中心的坐标
radius:辐射半径
centerColor:辐射中心的颜色
edgeColor:辐射边缘的颜色
tileMode:辐射范围之外的着色模式(同上tileMode)。
(3)SweepGradient 扫描渐变
SweepGradient(float cx, float cy, int color0, int color1)
参数:
cx cy :扫描的中心
color0:扫描的起始颜色
color1:扫描的终止颜色
(4)BitmapShader
BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)
参数:
bitmap:用来做模板的 Bitmap 对象
tileX:横向的 TileMode
tileY:纵向的 TileMode。
tileMode:辐射范围之外的着色模式(同上tileMode)。
【小知识】实现圆形图片 :
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.batman);
Shader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
paint.setShader(shader);
canvas.drawCircle(300, 300, 200, paint);
(5)ComposeShader 混合着色器 两个 Shader 一起使用。
ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode)
shaderA, shaderB:两个相继使用的 Shader
mode: 两个 Shader 的叠加模式,即 shaderA 和 shaderB 应该怎样共同绘制。它的类型是 PorterDuff.Mode 。
- Alpha 合成 (Alpha Compositing)
- 混合 (Blending)
PorterDuff.Mode: SRC_OVER,把源图像直接铺在目标图像上
PorterDuff.Mode.DST_OUT 在目标图像上挖出源图像效果
PorterDuff.Mode.DST_IN在目标图像上抠出源图像效果 等。https://developer.android.com/reference/android/graphics/PorterDuff.Mode.html
*4 setColorFilter(ColorFilter colorFilter)
colorFilter 为绘制设置颜色过滤。颜色过滤的意思
(1) LightingColorFilter 用来模拟简单的光照效果
LightingColorFilter(int mul, int add)
参数里的 mul 和 add 都是和颜色值格式相同的 int 值,其中 mul 用来和目标像素相乘,add 用来和目标像素相加: R' = R * mul.R / 0xff + add.R
G' = G * mul.G / 0xff + add.G
B' = B * mul.B / 0xff + add.B
一个「保持原样」的「基本 LightingColorFilter 」,mul 为 0xffffff,add 为 0x000000(也就是0)
去掉原像素中的红色,可以把它的 mul 改为 0x00ffff (红色部分为 0 )
(2) PorterDuffColorFilter 使用一个指定的颜色和一种指定的 PorterDuff.Mode 来与绘制对象进行合成
PorterDuffColorFilter(int color, PorterDuff.Mode mode)
color 参数是指定的颜色
mode 参数是指定的 Mode(只能指定一种颜色作为源,不是bitmap)
(3) ColorMatrixColorFilter
使用一个 ColorMatrix 来对颜色进行处理。 ColorMatrix这个类,内部是一个 4x5 的矩阵:
[ a, b, c, d, e,
f, g, h, i, j,
k, l, m, n, o,
p, q, r, s, t ]
ColorMatrix 可以把要绘制的像素进行转换。对于颜色 [R, G, B, A] ,转换算法是这样的:
R’ = a*R + b*G + c*B + d*A + e;
G’ = f*R + g*G + h*B + i*A + j;
B’ = k*R + l*G + m*B + n*A + o;
A’ = p*R + q*G + r*B + s*A + t;
setSaturation(float sat) 来设置饱和度;
demohttps://github.com/chengdazhi/StyleImageView
*5. setXfermode(Xfermode xfermode)
以绘制的内容作为源图像 以 View 中已有的内容作为目标图像,选取一个 PorterDuff.Mode 作为绘制内容的颜色处理方案
(1) 使用离屏缓冲(Off-screen Buffer)
通过使用离屏缓冲,把要绘制的内容单独绘制在缓冲层, Xfermode 的使用就不会出现奇怪的结果了
canvas.drawBitmap(rectBitmap, 0, 0, paint); // 画方
paint.setXfermode(xfermode); // 设置 Xfermode
canvas.drawBitmap(circleBitmap, 0, 0, paint); // 画圆
paint.setXfermode(null); // 用完及时清除 Xfermode
(2) 控制好透明区域
注意控制它的透明区域不要太小,要让它足够覆盖到要和它结合绘制的内容,否则得到的结果很可能不是你想要的
2.效果
*1.setAntiAlias (boolean aa) 设置抗锯齿
抗锯齿默认是关闭的 打开方式 1.setAntiAlias(aa)
2.实例化 new Paint(Paint.ANTI_ALIAS_FLAG);
*2. setStyle(Paint.Style style)
用来设置图形是线条风格还是填充风格的
FILL,是填充模式,默认模式
STROKE 是画线模式(即勾边模式)
FILL_AND_STROKE 是两种模式一并使用:既画线又填充。
在 STROKE 和 FILL_AND_STROKE 下,还可以使用 paint.setStrokeWidth(float width) 来设置线条的宽度:
*3.线条形状
4 个方法:
setStrokeWidth(float width)
线条宽度 0表示1像素 1表示2像素 2表示4像素
setStrokeCap(Paint.Cap cap)
设置线头的形状。
线头形状有三种:BUTT 平头(无头)、ROUND 圆头、SQUARE 方头(有一个正方形的头)。默认为 BUTT。
setStrokeJoin(Paint.Join join)
设置拐角的形状。
有三个值可以选择:MITER 尖角、 BEVEL 平角和 ROUND 圆角。默认为 MITER
setStrokeMiter(float miter)
当线条拐角为 MITER 时,拐角处的外缘需要使用延长线来补偿: MITER 型连接点有一个额外的规则:当尖角过长时,自动改用 BEVEL 的方式来渲染连接点
miter=1 / sin ( 角度 / 2 )
*4.色彩优化(图片)
(1) setDither(boolean dither)设置图像的抖动。
两个色彩相交形成的颜色 过于清晰时会看到 两个色彩小颗粒 设置setDither(true)让图像的抖动显示相交色
(2)setFilterBitmap(boolean filter)设置是否使用双线性过滤来绘制 Bitmap
图像在放大绘制,出现马赛克现象;开启了双线性过滤,可以让结果图像显得更加平滑paint.setFilterBitmap(true);
*5 setPathEffect(PathEffect effect)
图形的轮廓设置效果
PathEffect分为两类,
单一效果的 CornerPathEffect 作用:把所有拐角变成圆角。
CornerPathEffect(float radius) 的参数 radius 是圆角的半径
DiscretePathEffect 作用:把线条进行随机的偏离,让轮廓变得乱七八糟。乱七八糟的方式和程度由参数决定。
DiscretePathEffect(float segmentLength, float deviation) 的两个参数中, segmentLength 是用来拼接的每个线段的长度, deviation 是偏离量
DashPathEffect 使用虚线来绘制线条。DashPathEffect(float[] intervals, float phase) 中, 第一个参数 intervals 是一个数组,数组中元素必须为偶数(最少是 2 个),按 画线长度、空白长度的顺序排列;第二个参数 phase 是虚线的偏移量。
PathDashPathEffect 用图形链接成的线绘制线条
PathDashPathEffect(Path shape, float advance, float phase, PathDashPathEffect.Style style) shape 参数是用来绘制的 Path(图形) ;
advance 是两个相邻的 shape 段之间的间隔(shape起点和起点的间隔)
phase 和 DashPathEffect 中一样,是虚线的偏移
style 的类型为 PathDashPathEffect.Style
TRANSLATE:位移
ROTATE:旋转 图形旋转
MORPH:变体 图形旋转 并且和拐角 依照位置图形变动
组合效果的 SumPathEffect 分别按照两种 PathEffect 分别对目标进行绘制
ComposePathEffect 先对目标 Path 使用一个 PathEffect,然后再对这个改变后的 Path 使用另一个 PathEffect
*6 setShadowLayer(float radius, float dx, float dy, int shadowColor)在之后的绘制内容下面加一层阴影。 radius 是阴影的模糊范围; dx dy 是阴影的偏移量; shadowColor 是阴影的颜色。
清除阴影层,使用 clearShadowLayer() 。
注意:
在硬件加速开启的情况下, setShadowLayer() 只支持文字的绘制,文字之外的绘制必须关闭硬件加速才能正常绘制阴影。
如果 shadowColor 是半透明的,阴影的透明度就使用 shadowColor 自己的透明度;而如果 shadowColor 是不透明的,阴影的透明度就使用 paint 的透明度。
*7 setMaskFilter(MaskFilter maskfilter)
上一个方法 setShadowLayer() 是设置的在绘制层下方的附加效果;而这个 MaskFilter 和它相反,设置的是在绘制层上方的附加效果。
MaskFilter 有两种:
BlurMaskFilter
模糊效果的 MaskFilter。
NORMAL: 内外都模糊绘制
SOLID: 内部正常绘制,外部模糊
INNER: 内部模糊,外部不绘制
OUTER: 内部不绘制,外部模糊(什么鬼?)
EmbossMaskFilter。
浮雕效果的 MaskFilter。
EmbossMaskFilter(float[] direction, float ambient, float specular, float blurRadius)
direction 是一个 3 个元素的数组,指定了光源的方向; ambient 是环境光的强度,数值范围是 0 到 1; specular 是炫光的系数; blurRadius 是应用光线的范围
*8 获取绘制的 Path
getFillPath(Path src, Path dst)
Path ,指的就是 drawPath() 的绘制内容的轮廓,要算上线条宽度和设置的 PathEffect
??????
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)
文字的绘制 获取的就是目标文字所对应的 Path
3.drawText() 相关
下一节里单独讲。
初始化
1 reset()
重置 Paint 的所有属性为默认值。相当于重新 new 一个
2 set(Paint src)
把 src 的所有属性全部复制过来。相当于调用 src 所有的 get 方法,然后调用这个 Paint 的对应的 set 方法来设置它们。
3 setFlags(int flags)
批量设置 flags。相当于依次调用它们的 set 方法