Paint基本API四类
paint基本API分四个大类:1 颜色,2 效果,3 drawText相关paint设置,4 初始化
一 颜色
颜色设置分三个方式:1 基本颜色设置,2 ColorFilter,3 setXfermode
1 基本颜色设置
基本设置分为两种:1 直接设置颜色,2 设置着色器
1 直接设置颜色
1 paint.setColor()
2 paint.setARGB()
2 设置着色器 Paint.setShader(Shader shader)
着色规则: Shader.TileMode.CLAMP 夹子模式 Shader.TileMode.MIRROR 镜像模式 Shader.TileMode.REPEAL 重复模式
着色器5个子类:1线性渐变 LinearGradient 2辐射渐变 RadialGradient 3 扫描渐变 SweepGradient 4 BitmapShader 5 ComposeShader
1 线性渐变 LinearGradient 起点 重点 起始颜色 终止颜色 渐变规则
val shader = LinearGradient(0f, 100f, 0f, 500f, Color.RED, Color.BLUE, Shader.TileMode.MIRROR)
val paint1 = Paint()
paint1.shader = shader
canvas.drawCircle(600f, 600f, 600f, paint1)
2 辐射渐变 RadialGradient 辐射中心的坐标 x y 渐变起始颜色 渐变终止颜色 渐变规则
val shader = RadialGradient(0f, 0f, 500f, Color.RED, Color.BLUE, Shader.TileMode.REPEAT)
val paint2 = Paint()
paint2.shader = shader
canvas.drawCircle(500f, 500f, 500f, paint2)
3 扫描渐变 SweepGradient 扫描中点的坐标 x y 渐变起始颜色 渐变终止颜色
val shader = SweepGradient(500f, 500f, Color.RED, Color.BLUE)
val paint3 = Paint()
paint3.shader = shader
canvas.drawCircle(500f, 500f, 500f, paint3)
4 BitmapShader 图像着色(不再是渐变)就是用bitmap的像素作为文字或者图片的填充 这个着色方案可以 自定义圆形头像控件
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.test)
val shader = BitmapShader(bitmap, Shader.TileMode.MIRROR, Shader.TileMode.CLAMP)
val paint4 = Paint(Paint.ANTI_ALIAS_FLAG)
paint4.shader = shader
canvas.drawCircle(500f, 500f, 500f, paint4)
5 混合着色器 ComposeShader 结合两个着色器 结合规则麻烦 就不细说
第一个Shader
val bitmap1 = BitmapFactory.decodeResource(resources, R.drawable.test)
val shader1 = BitmapShader(bitmap1, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)
第二个 Shader:从上到下的线性渐变(由透明到黑色)
val bitmap2 = BitmapFactory.decodeResource(resources, R.drawable.timg)
val shader2 = BitmapShader(bitmap2, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)
ComposeShader:结合两个 Shader
val shader = ComposeShader(shader1, shader2, PorterDuff.Mode.SRC_OVER)
val paint5 = Paint()
paint5.shader = shader
canvas.drawCircle(500f, 500f, 500f, paint5)
2 ColorFilter
ColorFilter 这个类,它的名字已经足够解释它的作用:为绘制设置颜色过滤。颜色过滤的意思,就是为绘制的内容设置一个统一的过滤策略,然后 Canvas.drawXXX() 方法会对每个像素都进行过滤后再绘制出来。应用场景:有色光照射 有色玻璃透色 胶卷
ColorFilter 有三个子类 LightingColorFilter PorterDuffColorFilter ColorMatrixColorFilter
1 LightingColorFilter
LightingColorFilter 的构造方法是 LightingColorFilter(int mul, int add) ,参数里 的 mul 和 add 都是和颜色值格式相同的 int 值 其中 mul 用来和目标像素相乘,add 用来和目标像素相加:
LightingColorFilter filter1 = new LightingColorFilter(0x00ffff,0x000000);
paint.setColorFilter(filter1);
canvas.drawBitmap(bitmap, 0, 0, paint);
2 PorterDuffColorFilter
PorterDuffColorFilter 的作用是使用一个指定的颜色和一种指定的 PorterDuff.Mode 来与绘制对象进行合成。它的构造方法是 PorterDuffColorFilter(int color, PorterDuff.Mode mode) 其中的 color 参数是指定的颜色,mode 参数是指定的 Mode。同样也是 PorterDuff.Mode ,不过和 ComposeShader 不同的是,PorterDuffColorFilter 作为一个 ColorFilter,mode 参数是指定的 Mode。同样也是 PorterDuff.Mode ,不过和 ComposeShader 不同的是,PorterDuffColorFilter 作为一个 ColorFilter
3 ColorMatrixColorFilter
ColorMatrixColorFilter 使用一个 ColorMatrix 来对颜色进行处理 ColorMatrix 这个类, 内部是一个 4x5 的矩阵
设置饱和度
ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(0f);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
paint.setColorFilter(filter);
canvas.drawBitmap(bitmap, 0, 0, paint);
3 setXfermode
Xfermode” 其实就是 “Transfer mode”,用 “X” 来代替 “Trans” 是一些美国人喜欢用的简写方式 严谨地讲, Xfermode 指的是你要绘制的内容和 Canvas 的目标位置的内容应该怎样结合计算出最终的颜色 但通俗地说,其实就是要你以绘制的内容作为源图像,以 View 中已有的内容作为目标图像 选取一个 PorterDuff.Mode 作为绘制内容的颜色处理方案
二 效果
1 设置抗锯齿 paint.setAntiAlias (boolean aa) val paint= Paint(Paint.ANTI_ALIAS_FLAG) ,使绘制的图片边缘更圆滑
2 设置style paint.setStyle(Paint.Style style)
1 paint.setStyle(Paint.Style.FILL); // FILL 模式,填充
2 paint.setStyle(Paint.Style.STROKE); // STROKE 模式,画线
3 设置线条形状 paint.setStrokeX()
1 设置线条宽度 paint.setStrokeWith()
2 设置线条头部样式 paint.setStrokeCap(Paint.Cap cap)
样式有三种:BUTT 平头、ROUND 圆头、SQUARE 方头。默认为 BUTT 比如画点的时设置 圆点 还是方点
3 设置线条拐角样式 paint.setStrokeJoin(Paint.Join join)
样式有三个值可以选择:MITER 尖角、 BEVEL 平角和 ROUND 圆角。默认为 MITER。
4 线条拐角设置为尖角时的补充 paint.setStrokeMiter(float miter)
4 设置色彩优化
1 paint.setDither(boolean dither) 设置图像的抖动
2 paint.setFilterBitmap(boolean filter) 设置是否使用双线性过滤来绘制 Bitmap
5 图像轮廓设置paint.setPathEffect(PathEffect effect)
单一效果
1 CornerPathEffect 把所有拐角变成圆角。
2 DiscretePathEffect 线条进行随机的偏离,让轮廓变得乱七八糟。乱七八糟的方式和程度由参数决定。
3 DashPathEffect 使用虚线来绘制线条
4 PathDashPathEffect 这个方法比 DashPathEffect 多一个前缀 Path ,所以顾名思义,它是使用一个 Path 来绘制「虚线 把所有拐角变成圆角。
组合效果
5 SumPathEffect 这是一个组合效果类的 PathEffect 。它的行为特别简单,就是分别按照两种 PathEffect 分别对目标进行
6 ComposePathEffect 这也是一个组合效果类的 PathEffect 。不过它是先对目标 Path 使用一个 PathEffect,然后再对这个改变后的 Path 使用另一个 PathEffect。
注意:PathEffect 在有些情况下不支持硬件加速,需要关闭硬件加速才能正常使用:
Canvas.drawLine() 和 Canvas.drawLines() 方法画直线时,setPathEffect() 是不支持硬件加速的;
PathDashPathEffect 对硬件加速的支持也有问题,所以当使用 PathDashPathEffect 的时候,最好也把硬件加速关了。
6 在绘制图形下面加一层阴影 paint.setShadowLayer(float radius, float dx, float dy, int shadowColor)
注意:
在硬件加速开启的情况下, setShadowLayer() 只支持文字的绘制,文字之外的绘制必须关闭硬件加速才能正常绘制阴影。如果 shadowColor 是半透明的,阴影的透明度就使用 shadowColor 自己的透明度;而如果 shadowColor 是不透明的,阴影的透明度就使用 paint 的透明度。
7 在绘制层上方的附加效果 paint.setMaskFilter(MaskFilter maskFilter)
1 BlurMaskFilter 模糊效果的
四种模糊的类型:NORMAL: 内外都模糊绘制 SOLID: 内部正常绘制,外部模糊 INNER: 内部模糊,外部不绘制 OUTER: 内部不绘制,外部模糊
2 MaskFilter 浮雕效果的
8 根据 paint 的设置,计算出绘制 Path 或文字时的实际 Path。 Path.getXXPath()
1 paint.getFillPath(Path src, Path dst) 获取实际path src 原有path dst实际path
2 paint.getTextPath(。。。) 获取的就是目标文字所对应的 Path 。这个就是所谓「文字的 Path」。
三 drawText相关paint设置
1 设置文字大小 paint.setTextSize()
2 设置文字间隔 paint.setLetterSpacing(float letterSpacing)
……