Paint 画笔高级应用

Paint 画笔高级应用

  • 概念

画笔,保存了绘制几何图形、文本和位图的样式和颜色信息

  • 常用 API

常用 API 主要如颜色,效果和文本相关等

方法 作用
setColor 设置颜色
setARGB 设置 Paint 对象颜色,范围为 0~255
setAlpha 设置 alpha 不透明度,范围为 0~255
setAntiAlias 抗锯齿
setStyle 描边效果
setStrokeWidth 描边宽度
setStrokeCap 圆角效果
setStrokeJoin 拐角风格
setShader 设置环形渲染器
setXfermode 设置图层混合模式
setColorFilter 设置颜色过滤器
setFilterBitmap 设置双线性过滤
setMaskFilter 设置画笔遮罩滤镜,传入度数和样式
setTextScaleX 设置文本缩放倍数
setTextSize 设置字体大小
setTextAlign 对齐方式
setUnderlineText 设置下划线
getTextBounds 测量文本大小,将文本大小信息存放在 rect 中
measureText 获取文本的宽
getFontMetrics 获取字体度量对象

Paint 详解 - 颜色相关

  • setColor(int color) 参数具体的颜色值,16进制数值,0xFFFF0000
  • setARGB(int a, int r, int g, int b) 参数分别透明度,红,绿,蓝。0-255数值
  • setShader(Shader shader) 参数着色器对象,一般使用 shader 的几个子类
    • LinearGradient:线性渲染
    • RadialGradient:环形渲染
    • SweepGradient:扫描渲染
    • BitmapGradient:位图渲染
    • ComposeShader:组合渲染,例如 LinearGradient + BitmapGradient
  • setColorFilter(ColorFilter colorFilter) 设置颜色过滤。一般使用 ColorFilter 的三个子类:
    • LightingColorFilter:光照效果
    • PorterDuffColorFilter:指定一个颜色和一种 PorterDuff.Mode 与绘制对象进行合成
    • ColorMatrixColorFilter:使用一个 ColorMatrix 来对颜色进行处理

LinearGradient 线性渲染

构造方法:

LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile)


参数:

x0 y0 x1 y 1:渐变的两个端点的位置

color0 color1:端点的颜色

tile:端点范围之外的着色规则,类型是 TileMode


使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
// (x0, y0):渐变起始点坐标
// (x1, y1):渐变结束点坐标
// color0:渐变开始点颜色,16进制的颜色表示,必须带有透明度
// color1:渐变结束颜色
// colors:渐变数组
// positions:位置数组,position 的取值范围[0, 1],作用是制指定某个位置的颜色值,如果传 null,渐变就线性变化。
// tile:用于指定控件区域大于指定的渐变区域时,空白区域的颜色填充方法

mShader = new LinearGradient(0, 0, 500, 500, new int[]{Color.RED, Color.BLUE}, null, Shader.TileMode.CLAMP);

mPaint.setShader(mShader);

canvas.drawCircle(250, 250, 250, mPaint);

RadialGradient 环形渲染

构造方法:

RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, TileMode tileMode)


参数:

centerX centerY:辐射中心的坐标

radius:辐射半径

centerColor:辐射中心的颜色

edgeColor:辐射边缘的颜色

tileMode:辐射范围之外的着色规则,类型是 TileMode


使用:

1
2
3
4
5
6
7
8
9
10
11
12
// centerX, centerY:Shader 的中心坐标,开始渐变的坐标
// radius:渐变的半径
// centerColor, edgeColor:中心点渐变颜色,边界的渐变颜色
// colors:渐变颜色数组
// stoops:渐变位置数组,类似扫描渐变的 positions 数组,取值 [0, 1],中心点为 0,半径到达位置为 1.0f
// tileMode:Shader 未覆盖以外的填充模式

mShader = new RadialGradient(250, 250, 250, new int[]{Color.GREEN, Color.YELLOW, Color.RED}, null, Shader.TileMode.CLAMP);

mPaint.setShader(mShader);

canvas.drawCircle(250, 250, 250, mPaint);

SweepGradient 扫描渲染

构造方法:

SweepGradient(float cx, float cy, int color0, int color1)


参数:

cx, cy:扫描的中心

color0:扫描的起始颜色

color1:扫描的终止颜色


使用:

1
2
3
4
5
6
7
8
9
// cx, cy:渐变坐标
// color0, color1:渐变开始结束颜色
// colors, positions:类似 LinearGradient,用于多颜色渐变,positions 为 null 时,根据颜色线性渐变

mShader = new SweepGradient(250, 250, Color.RED, Color.GREEN);

mPaint.setShader(mShader);

canvas.drawCircle(250, 250 ,250, mPaint);

BitmapGradient 位图渲染

构造方法:

BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tilY)


参数:

bitmap:用来做模板的 Bitmap 对象

tileX:横向的着色规则,类型是 TileMode

tileY:纵向的着色规则,类型是 TileMode


使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
// Bitmap:构造 Shader 使用的 Bitmap
// tileX:X轴方向的 TileMode
// tileY:Y轴方向的 TileMode
// REPEAT,绘制区域超过渲染区域的部分,重复排版
// CLAMP,绘制区域超过渲染区域的部分,会以最后一个像素拉伸排版
// MIRROR,绘制区域超过渲染的区域的部分,镜像翻转排版


mShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP);

mPaint.setShader(mShader);

canvas.drawCircle(250, 250 ,250, mPaint);

ComposeShader 组合渲染

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Bitmap:构造 Shader 使用的 Bitmap
// tileX:X轴方向的 TileMode
// tileY:Y轴方向的 TileMode
// REPEAT,绘制区域超过渲染区域的部分,重复排版
// CLAMP,绘制区域超过渲染区域的部分,会以最后一个像素拉伸排版
// MIRROR,绘制区域超过渲染的区域的部分,镜像翻转排版


BitmapShader bitmapShader = new BitmapShader(mBitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);

LinearGradient linearGradient = new LinearGradient(0, 0, 1000, 1600, new int[]{Color.RED, Color.BLUE}, null, Shader.TileMode.CLAMP);

mShader = new ComposeShader(bitmapShader, linearGradient, PorterDuff.Mode.MUTIPLY);

mPaint.setShader(mShader);

canvas.drawCircle(250, 250 ,250, mPaint);

Paint 画笔高级应用
https://blog.funkt.cn/2022/02/17/1494122556523839490/
作者
anjiemo
发布于
2022年2月17日
许可协议
未经作者授权,禁止转载