paint 类
1. 颜色相关
1.1 设置颜色
setColor(int color);
setARGB(int a, int r, int g, int b);
复制代码
1.2 设置着色器
setShader(Shader shader);
复制代码
注:设置后,setColor/ARGB() 方法无效。
1.2.1 LinearGradient 线性渐变着色器
// x0 y0 x1 y1:渐变的两个端点的位置
// color0 color1 是端点的颜色
// tile:端点范围之外的着色规则
LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile);
复制代码
1.2.2 RadialGradient 辐射渐变 从中心向周围辐射状的渐变
// centerX centerY:辐射中心的坐标
// radius:辐射半径
// edgeColor:辐射边缘的颜色
// tileMode:辐射范围之外的着色模式。
RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, TileMode tileMode);
复制代码
1.2.3 SweepGradient 扫描渐变。
// cx cy :扫描的中心
// color0:扫描的起始颜色
// color1:扫描的终止颜色
SweepGradient(float cx, float cy, int color0, int color1);
复制代码
着色规则:
- CLAMP 会在端点之外延续端点处的颜色;
- MIRROR 是镜像模式;
- REPEAT 是重复模式。
1.2.4 BitmapShader 图片着色器。
// bitmap:用来做模板的 Bitmap 对象
// tileX:横向的 TileMode
// tileY:纵向的 TileMode。
BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY);
复制代码
1.2.5 ComposeShader 混合着色器 把两个 Shader 一起使用。
// shaderA, shaderB:两个相继使用的 Shader
// mode: 两个 Shader 的叠加模式,即 shaderA 和 shaderB 应该怎样共同绘制。
ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode);
复制代码
例:
// 第二个 Shader:从上到下的线性渐变(由透明到黑色)
Bitmap bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.batman_logo);
Shader shader2 = new BitmapShader(bitmap2, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
// ComposeShader:结合两个 Shader
Shader shader = new ComposeShader(shader1, shader2, PorterDuff.Mode.SRC_OVER);
paint.setShader(shader);
...
canvas.drawCircle(300, 300, 300, paint);
复制代码
- Alpha 合成 (Alpha Compositing)
- 混合 (Blending)
源图像和目标图像
Alpha 合成:
混合
1.3 设置颜色过滤
// colorFilter颜色过滤类
setColorFilter(ColorFilter colorFilter);
复制代码
1.3.1 LightingColorFilter 模拟简单的光照效果
// mul 用来和目标像素相乘
// add 用来和目标像素相加
LightingColorFilter(int mul, int add);
复制代码
1.3.2 PorterDuffColorFilter 使用一个指定的颜色和一种指定的 PorterDuff.Mode 来与绘制对象进行合成。
PorterDuffColorFilter(int color, PorterDuff.Mode mode);
复制代码
1.3.3 ColorMatrixColorFilter 使用一个 ColorMatrix 来对颜色进行处理。
复制代码
可使用 setSaturation(float sat);设置饱和度。
1.4 Xfermode
指的是你要绘制的内容和 Canvas 的目标位置的内容应该怎样结合计算出最终的颜色。但通俗地说,其实就是要你以绘制的内容作为源图像,以 View 中已有的内容作为目标图像,选取一个 PorterDuff.Mode 作为绘制内容的颜色处理方案。
例:
Xfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.DST_IN);
...
canvas.drawBitmap(rectBitmap, 0, 0, paint); // 画方
paint.setXfermode(xfermode); // 设置 Xfermode
canvas.drawBitmap(circleBitmap, 0, 0, paint); // 画圆
paint.setXfermode(null); // 用完及时清除 Xfermode
复制代码
使用注意
- 使用离屏缓冲(Off-screen Buffer)
Canvas.saveLayer();
int saved = canvas.saveLayer(null, null, Canvas.ALL_SAVE_FLAG);
canvas.drawBitmap(rectBitmap, 0, 0, paint); // 画方
paint.setXfermode(xfermode); // 设置 Xfermode
canvas.drawBitmap(circleBitmap, 0, 0, paint); // 画圆
paint.setXfermode(null); // 用完及时清除 Xfermode
canvas.restoreToCount(saved);
复制代码
View.setLayerType()
复制代码
总结:
2. 绘制相关的设置
2.1 设置绘制模式
// FILL 是填充模式,
// STROKE 是画线模式(即勾边模式)
// FILL_AND_STROKE 是两种模式一并使用:既画线又填充。
// 它的默认值是 FILL,填充模式。
setStyle(Paint.Style style);
复制代码
2.1 设置线条的宽度,在 STROKE 和 FILL_AND_STROKE 下
// width 宽度,单位像素
setStrokeWidth(float width);
复制代码
2.2 设置线头的形状
// BUTT 平头、ROUND 圆头、SQUARE 方头
setStrokeCap(Paint.Cap cap);
复制代码
2.3 设置拐角的形状
// MITER 尖角、 BEVEL 平角和 ROUND 圆角
settrokeJoin(Paint.Join join);
复制代码
2.4 拐角的补偿
对 setStrokeJoin() 的补充,设置 MITER 拐角的延长线的最大值。 线条在 Join 类型为 MITER 时对于 MITER 的长度限制。
setStrokeMiter(float miter);
复制代码
2.5 设置抗锯齿
setAntiAlias(boolean aa);
//或在new Paint()的时添加 ANTI_ALIAS_FLAG参数;
复制代码
2.6 设置图像抖动
图像从较高色彩深度(即可用的颜色数)向较低色彩深度的区域绘制时,在图像中有意地插入噪点,通过有规律地扰乱图像来让图像对于肉眼更加真实的做法。
setDither(boolean dither);
复制代码
2.7 是否使用双线性过滤来绘制 Bitmap 。
setFilterBitmap(boolean filter);
复制代码
2.8 设置轮廓效果
// effect 轮廓效果
setPathEffect(PathEffect effect);
复制代码
2.8.1 CornerPathEffect 拐角变圆角
// radius 是圆角的半径
CornerPathEffect(float radius);
复制代码
例
PathEffect pathEffect = new CornerPathEffect(20);
paint.setPathEffect(pathEffect);
canvas.drawPath(path, paint);
复制代码
2.8.2 DiscretePathEffect 线条进行随机的偏离,让轮廓变得乱七八糟。
// segmentLength 是用来拼接的每个线段的长度
// deviation 是偏离量
DiscretePathEffect(float segmentLength, float deviation);
复制代码
例
PathEffect pathEffect = new DiscretePathEffect(20, 5);
paint.setPathEffect(pathEffect);
canvas.drawPath(path, paint);
复制代码
- DiscretePathEffect 线条进行随机的偏离,让轮廓变得乱七八糟。
// ntervals 指定了虚线的格式:数组中元素必须为偶数(最少是 2 个)
// phase 虚线的偏移量
DashPathEffect(float[] intervals, float phase);
复制代码
例
PathEffect pathEffect = new DashPathEffect(new float[]{20, 10, 5, 10}, 0);
paint.setPathEffect(pathEffect);
canvas.drawPath(path, paint);
复制代码
2.8.3 PathDashPathEffect 用 Path 来绘制虚线
// shape 参数是用来绘制的 Path
// advance 是两个相邻的 shape 段之间的间隔,不过注意,这个间隔是两个 shape 段的起点的间隔,而不是前一个的终点和后一个的起点的距离;
// phase 虚线的偏移
// style 指定拐弯改变的时候 shape 的转换方式
PathDashPathEffect(Path shape, float advance, float phase, PathDashPathEffect.Style style);
复制代码
style 类型
- TRANSLATE:位移
- ROTATE:旋转
- MORPH:变体
2.8.4 SumPathEffect 组合效果 分别使用
PathEffect dashEffect = new DashPathEffect(new float[]{20, 10}, 0);
PathEffect discreteEffect = new DiscretePathEffect(20, 5);
pathEffect = new SumPathEffect(dashEffect, discreteEffect);
canvas.drawPath(path, paint);
复制代码
2.8.5 ComposePathEffect 组合效果 组合使用
// innerpe 是先应用的
// outerpe 是后应用的
ComposePathEffect(PathEffect outerpe, PathEffect innerpe);
复制代码
PathEffect dashEffect = new DashPathEffect(new float[]{20, 10}, 0);
PathEffect discreteEffect = new DiscretePathEffect(20, 5);
pathEffect = new ComposePathEffect(dashEffect, discreteEffect);
...
canvas.drawPath(path, paint);
复制代码
2.9 设置阴影效果
// radius 是阴影的模糊范围;
// dx dy 是阴影的偏移量;
// shadowColor 是阴影的颜色。
setShadowLayer(float radius, float dx, float dy, int shadowColor)
复制代码
清除阴影层,使用 clearShadowLayer();
2.10 绘制层上方的附加效果
setMaskFilter(MaskFilter maskfilter);
复制代码
2.10.1 MaskFilter BlurMaskFilter 模糊效果
// radius 模糊的范围,
// style 是模糊的类型
BlurMaskFilter(float radius, BlurMaskFilter.Blur style);
复制代码
模糊类型
- NORMAL: 内外都模糊绘制
- SOLID: 内部正常绘制,外部模糊
- INNER: 内部模糊,外部不绘制
- OUTER: 内部不绘制,外部模糊(什么鬼?)
2.10.2 浮雕效果
// direction 3 个元素的数组,指定了光源的方向;
// ambient 环境光的强度,数值范围是 0 到 1;
// specular 炫光的系数;
// blurRadius 应用光线的范围
EmbossMaskFilter(float[] direction, float ambient, float specular, float blurRadius);
复制代码
例:
paint.setMaskFilter(new EmbossMaskFilter(new float[]{0, 1, 1}, 0.2f, 8, 10));
...
canvas.drawBitmap(bitmap, 100, 100, paint);
复制代码
3. 其他
3.1 获取绘制的 path
// src 是原 Path
// dst 实际 Path 的保存位置
getFillPath(Path src, Path dst);
复制代码
3.2 重置 Paint 的所有属性为默认值
reset();
复制代码
3.3 把 src 的所有属性全部复制过来
set(Paint src);
复制代码
3.4 批量设置 flags。相当于依次调用它们的 set 方法
setFlags(int flags);
复制代码