Paint画笔
常用api
初始化
Paint mPaint = new Paint();
设置颜色
mPaint.setColor(Color.RED);
设置透明度, 范围0~255
mPaint.setAlpha(200);
抗锯齿
mPaint.setAntiAlias(true)
描边效果
//填充
mPaint.setStyle(Paint.Style.FILL);
//描边
mPaint.setStyle(Paint.Style.STROKE);
//描边并且填充
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
效果图如下:
2019-04-18_100001.png
描边宽度
mPaint.setStrokeWidth(4);
圆角效果
//笔划以路径结束,并且不会超出它, 默认值
mPaint.setStrokeCap(Paint.Cap.Butt);
//在结束路径外, 添加圆角效果
mPaint.setStrokeCap(Paint.Cap.Round);
//笔划以方形投影,中心位于路径的末端
mPaint.setStrokeCap(Paint.Cap.SQUARE);
效果图如下
2019-04-18_100102.png
拐角风格
//斜接
mPaint.setStrokeJoin(Paint.Join.MITER);
// 斜角
mPaint.setStrokeJoin(Paint.Join.BEVEL);
//圆角
mPaint.setStrokeJoin(Paint.Join.ROUND);
如下图所示:
2019-04-18_101105.png
设置渲染器
渲染器分为5种, 下面会讲到
LinearGradient, RadialGradient, SweepGradient, BitmapShader, ComposeShader.
mPaint.setShader(new SweepGradient(200, 200, Color.BLUE, Color.RED, )
设置图层混合模式
mPaint.setXfermode(new PorterDuffXfermoode(PorterDuff.Mode.DARKEN));
设置颜色过滤器
mPaint.setColorFilter(new LightingColorFilter(0x00ffff, 0x000000))
设置双线性过滤
mPaint.setFilterBitmap(true);
设置画笔遮罩滤镜
mPaint.setMaskFilter(new BlurMaskFilter.Blur.NORMAL);
设置文本缩放倍数
mPaint.setTextScale(2)
设置字体大小
mPaint.setTextSize(38);
对齐方式
mPaint.setTextAlign(Paint.Align.LEFT);
设置下划线
mPaint.setUnderlineText(true);
测量文本大小, 将信息存放在rect中
String str = "Android 高级开发工程师";
Rect rect = new Rect();
mPaint.getTextBounds(str, 0, str.length(), rect);
获取文本的宽度
mPaint.measureText(str);
获取字体度量单位
mPaint.getFontMetrics();
字体的度量
2019-04-18_103031.png
颜色相关
2019-04-18_103246.png
线性渲染
构造方法:
LinearGradient(float x0, float y0, float x1, float y1,int color0, int color1, Shader.TileMode tile)
参数:
x0 y0 x1 y1: 渐变的两个端点的位置
color0 color1是端点的颜色
tile:端点范围之外的着色原则, 类型是TileMode
使用:
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(float centerX, float centerY, float radius, int centerColor, int edgeColor, TileMode tileMode)
参数:
centerX centerY:辐射中心的坐标
radius:辐射半径
centerColor:辐射中心颜色
edgeColor:辐射边缘的颜色
tileMode:辐射范围之外的着色规则, 类型是TileMode
使用:
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(float cx, float cy, int color0, int color1);
参数:
cx cy:扫描的中心
color0:扫描的起始颜色
color:扫描的终止颜色
使用:
mShader = new SweepGradient(250, 250, Color.RED, Color.GREEN);
mPaint.setShader(mShader);
canvas.drawCircle(250, 250, 250, mPaint);
位图渲染
构造方法:
BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY);
参数:
bitmap:用来做模板的Bitmap对象
tileX:横向的着色规则, 类型是TileMode
titleY:纵向的着色规则, 类型是TileMode
使用:
mShader = new BitmapShader(mBitmap,Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
mPaint.setShader(mShader);
canvas.drawCircle(250, 250, 250, mPaint);
组合渲染
构造方法:
ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode);
参数:
shaderA, shaderB: 两个相继使用的Shader
mode:两个Shader的叠加模式, 即shaderA和shaderB应该怎样共同绘制。他的类型是PorterDuff.Mode
使用:
BitmapShader bitmapShader = new BitmapShader(mBitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
LinearGradient linearGradient = new LinearGradient(0, 0, 1000, 1600, new int[]{Color.RED, Color.GREEN, Color.BLUE}, null, Shader.TileMode.CLAMP);
mShader = new ComposeShader(bitmapShader, linearGradient, PorterDuff.Mode.MUTIPLY);
mPaint.setShader(mShader);![2019-04-18_115844.png](https://img.haomeiwen.com/i16225542/876f688003433166.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
canvas.drawCircle(250, 250, 250, mPaint);
图层混合模式
他将所绘制图形的像素与Canvas中对应位置的像素按照一定规则进行混合, 形成新的像素值, 从而更新Canvas中最终的像素颜色值。
18中模式
2019-04-18_115844.png
2019-04-18_212535.png
禁止硬件加速, 离屏绘制
通过使用离屏缓冲, 把要绘制的内容单独绘制在缓冲层, 保证Xfermode的使用,不会出现错误的结果。
使用离屏缓冲有两种方式:
Canvas.saveLayer();可以做短时的离屏缓冲, 在绘制之前保存, 绘制之后恢复:
int saveId = canvas.saveLayer(0, 0, width, height, Canvas.ALL_SAVE_FLAG);
Canvas.drawBitmap(rectBitmap, 0, 0, paint);//画方
paint.setXfermode(xfermode);
canvas.drawBitmap(circleBitmap, 0, 0, paint);//画园
paint.setXfermode(null);
canvas.restroreToCount(saveId);
//直接把整个view都绘制在离屏缓冲中
view.setLayerType();
//使用GPU缓冲
setLayerType(LAYER_TYPE_HARDWARE);
//使用一个bitmap来缓冲
setLayerType(LAYER_TYPE_SOFTWARE);
setLayerType(View.LAYER_TYPE_SOFTWARE , null);
//离屏绘制
int layerId = canvas.saveLayer(0, 0, getWidth(), getHeight(), mPaint, Canvas.ALL_SAVE_FLAG);
canvas.retoreToCount(layerId);
LightingColorFilter滤镜
LightingColorFilter
构造方法:
LightingColorFilter(int mul, int add)
参数:
mul和add都是和颜色值格式相同的int值, 其中mul用来和目标像素相乘, add用来和目标像素相加:
R' = Rmul.R/0xff + add.R
G' = Gmul.G/0xff+add.G
B' = B*mulj.B/0xff+add.B
使用:
ColorFilter lighting = new LightingColorFilter(0x00ffff, 0x000000);
paint.setColorFilter(lighting);
canvas.drawBitmap(bitmap, 0, 0, paint);
PorterDuffColorFilter滤镜
PorterDuffColorFilter
构造函数:
PorterDuffColorFilter(int color, PorterDuff.Mode mode)
参数:
color, 具体的颜色值, 例如Color.RED
mode, 指定PorterDuff.Mode混合模式
使用:
PorterDuffColorFilter porterDuffColorFilter = new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.DARKEN);
paint.setColorFilter(porterDuffColorFilter);
canvas.drawBitmap(mBitmap, 100, 0, paint);
ColorMatrixColorFilter滤镜
ColorMatrixColorFilter
构造方法:
ColorMatrixColorFilter(float[] colorMatrix);
参数:
colorMatrix矩阵数组
使用:
float[] colorMatrix = {
1, 0, 0, 0, 0,
0, 1, 0, 0, 0,
0, 0, 1, 0, 0,
0, 0, 0, 1, 0
};
mColorMatrixColorFilter = new ColorMatrixColorFilter(colorMatrix);
mPaint.setColorFilter(mColorMatrixColorFilter);
canvas.drawBitmap(mBitmap, 100, 0, mPaint);