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
使用:
// (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
使用:
// 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:扫描的终止颜色
使用:
// 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
使用:
// 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 组合渲染
// 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);
本文由
A lonely cat
原创发布于
阳光沙滩
,未经作者授权,禁止转载