011-Android自定义View(6):画笔Paint

1,039 阅读5分钟

简介

Paint 可视为画笔,可定义颜色、线条、图案、填充等属性

常用功能/方法

方法功能备注
setColor()设置画笔颜色
setStrokeWidth()设置画笔绘线宽度 (笔芯粗细,单位px)当画布缩放时,画笔粗细会跟着缩放,设置setStrokeWidth(0)时,不会跟着缩放,就一直是1px粗
setAntiAlias()设置是否开启抗锯齿
setAlpha()设置画笔透明度参数取值范围【0-255】
setARGB()设置透明度&颜色
setStyle()设置画笔描边模式 or 填充模式 or 填充内部+描边Paint.Style.FILL 填充内部 Paint.Style.STROKE :描边 Paint.Style.FILL_AND_STROKE :填充内部和描边 FILL与FILL_AND_STROKE : 实际绘制尺寸一致 FILL与STROKE : STROKE实际大 FILL 二分之一的画笔线宽
setStrokeJoin()设置画笔连接线头时的过渡样式MITER:直来直去 ROUND: 圆角缓接 BEVEL: 斜切连接
setStrokeMiter()设置斜切连接模式时,长度限制
setStrokeCap()设置画笔画点(/圆)时的样式,笔尖离开/接触画布时的线头样式BUTT平头 ROUND圆头 SQUARE方头
setPathEffect()设置画线样式PathEffect pathEffect = new CornerPathEffect(20); //圆角radius值 paint.setPathEffect(pathEffect); //拐角缓冲为圆角
//虚线
PathEffect dashPathEffect = new DashPathEffect(new float[]{100, 50}, 0);//数组个数必须为偶数,用于设置 显示、隐藏的length ,0为偏移量
paint.setPathEffect(dashPathEffect);//设置为虚线
// 使用path 绘制虚线
Path dashPath ;//绘制形状
PathEffect pathEffect = new PathDashPathEffect(dashPath, 40, 0, PathDashPathEffectStyle.TRANSLATE);//参数1:自定义Path,参数2:空白间隔,参数3:偏移量,参数4:拐角缓冲样式(位移:TRANSLATE 旋转:ROTATE 变体:MORPH)
paint.setPathEffect(pathEffect);//设置自定义形状的虚线
//线条随机偏移
paint.setPathEffect(new DiscretePathEffect(50,10));//参数1:分段长度,参数2:偏移量
// 同时绘制线
PathEffect sumPathEffect = new
SumPathEffect(dashPathEffect, discretePathEffect);
paint.setPathEffect(sumPathEffect);
//合并绘制
PathEffect dashPathEffect = new DashPathEffect(new float[]{20, 10}, 0);
PathEffect discretePathEffect = new DiscretePathEffect(20, 5);
PathEffect composePathEffect = new ComposePathEffect(dashPathEffect, discretePathEffect);
paint.setPathEffect(composePathEffect );
PathEffect使用时,需关闭硬件加速
setShader()设置画笔渐变LinearGradient linearGradient = new LinearGradient(100,100,200,100,
Color.RED,Color.BLUE,Shader.TileMode.MIRROR) ; //设置渐变区域 属性
paint.setShader(linearGradient); //设置线性渐变
canvas.drawLine(100,100,500,100,paint); //划线
canvas.drawRect(100,200,500,500,paint); //画矩形
LinearGradient linearGradient = new LinearGradient(100,100,500,100,new int [] {Color.RED,Color.YELLOW,Color.BLUE},new float[]{0,0.5f,1},Shader.TileMode.CLAMP) ; //设置渐变区域 属性 前2参数:起点坐标,next2参数:终点坐标,next参数:多种颜色 ,next参数:颜色位置比例,nex渐变模式:
paint.setShader(linearGradient); //设置线性渐变
canvas.drawLine(100,100,500,100,paint); //划线
//同理径向渐变RadialGradient、 扫描渐变SweepGradient、位图渐变BitmapShader、混合渐变ComposeShader
//两个颜色
SweepGradient sweepGradient = new SweepGradient(400,400,Color.RED,Color.BLUE) ;//设置圆心xy起始结束颜色
paint.setShader(sweepGradient); //设置扫描渐变
canvas.drawCircle(400,400,300,paint); //圆心xy ,半径r
//多种颜色
sweepGradient = new SweepGradient(400,1200,new int[]{Color.RED,Color.YELLOW,Color.GRAY,Color.BLUE},null) ;//设置圆心,颜色,位置比例、设置为 null 则均分
paint.setShader(sweepGradient); //设置扫描渐变
canvas.drawCircle(400,1200,300,paint); //绘制
//两个颜色
RadialGradient radialGradient = new
RadialGradient(400,400,300,Color.RED,Color.BLUE,Shader.TileMode.CLAMP) ;//设置渐变区域 属性
paint.setShader(radialGradient); //设置径向渐变
canvas.drawCircle(400,400,300,paint); //圆心xy半径r
//多种颜色
radialGradient = new RadialGradient(400,1200,300,new int[]{Color.RED,Color.YELLOW,Color.GRAY,Color.BLUE},new float[]{0,0.4f,0.8f,1},Shader.TileMode.CLAMP) ;// 圆心xy,半径r,颜色数组,颜色位置比例,渐变模式
paint.setShader(radialGradient); //设置径向渐变
canvas.drawCircle(400,1200,300,paint); //
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.agns); //获取图片资源 转换成bitmap 对象
BitmapShader bitmapShader = new BitmapShader(bitmap,Shader.TileMode.REPEAT,Shader.TileMode.CLAMP);//设置 x,y平铺模式
paint.setShader(bitmapShader);
canvas.drawRect(10,10,800,800,paint);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher_2); //获取图片资源 转换成bitmap 对象
Shader shader1 = new BitmapShader(bitmap,Shader.TileMode.REPEAT,Shader.TileMode.MIRROR);//设置 x,y 方向格式
LinearGradient shader2 = new LinearGradient( //线性渐变
0,0,500,0,Color.RED,Color.BLUE,Shader.TileMode.MIRROR);
// ComposeShader:结合两个 Shader
Shader shader = new ComposeShader(shader1, shader2, PorterDuff.Mode.XOR); //XOR 表示 裁剪shader1 shader2 交集
paint.setShader(shader);
canvas.drawRect(0,0,getRight(),getBottom(),paint);

*颜色效果处理

方法功能备注
setColorFilter()设置颜色过滤器Bitmap bitmap =BitmapFactory.decodeResource(getResources(),R.mipmap.agns); //获取图片资源 转换成bitmap 对象
canvas.drawBitmap(bitmap,200,200,paint);
ColorFilter lightingColorFilter = new LightingColorFilter(0x00ffff, 0x000000);
//去掉红色
ColorFilter lightingColorFilter = new LightingColorFilter(0xffffff, 0x008800); //绿色加浓
paint.setColorFilter(lightingColorFilter);
canvas.drawBitmap(bitmap,200,600,paint);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher_2); //获取图片
canvas.drawBitmap(bitmap,200,200,paint);
ColorFilter colorFilter = new PorterDuffColorFilter(Color.GREEN, PorterDuff.Mode.XOR); //去掉 和 绿色结合的部分
paint.setColorFilter(colorFilter);
canvas.drawBitmap(bitmap,200,600,paint);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher_2); //获取图片资源
canvas.drawBitmap(bitmap,200,200,paint);
ColorFilter colorFilter = new PorterDuffColorFilter(Color.GREEN,
PorterDuff.Mode.XOR); //
paint.setColorFilter(colorFilter);
canvas.drawBitmap(bitmap,200,600,paint);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher_2); //获取图片资源
canvas.drawBitmap(bitmap,200,200,paint);
ColorMatrix colorFilter = new ColorMatrix(new float[]{
-1f, 0f, 0f, 0f, 255f,
0f, -1f, 0f, 0f, 255f,
0f, 0f, -1f, 0f, 255f,
0f, 0f, 0f, 1f, 0f });
paint.setColorFilter(new ColorMatrixColorFilter(colorFilter));
canvas.drawBitmap(bitmap,200,600,paint);
Bitmap bitmapone = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher_2); //获取图片资源 转换成bitmap 对象
Bitmap bitmapTwo = BitmapFactory.decodeResource(getResources(),R.mipmap.rect_2); //获取图片资源 转换成bitmap 对象
Xfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.DST_IN); //取交集,交集样式取决于下层,颜色取决于上层
int saved = canvas.saveLayer(null, null, Canvas.ALL_SAVE_FLAG);
canvas.drawBitmap(bitmapTwo, 0, 0, paint);
paint.setXfermode(xfermode); // 设置 Xfermode
canvas.drawBitmap(bitmapone, 0, 0, paint);
paint.setXfermode(null); // 用完及时清除 Xfermode
canvas.restoreToCount(saved);

*色彩优化

自建Bitmap绘制,位深低时可开启,效果明显。

mPaint.setDither(true);//开启图像抖动
mPaint.setFilterBitmap(true); //开启线性过滤

设置阴影效果-图层之下

mPaint.setShadowLayer(20, 0, 0, Color.RED);//
canvas.drawText("带阴影的文字",100,100,mPaint);//阴影模糊范围,偏移量x,y ,阴影颜色
mPaint.clearShadowLayer(); //清楚阴影

设置蒙层

this.setLayerType(LAYER_TYPE_SOFTWARE, null);
        Bitmap bitmapone = BitmapFactory.decodeResource(getResources(),R.mipmap.agns); //获取图片资源 转换成bitmap 对象
        BlurMaskFilter blurMaskFilterNORMAL = new BlurMaskFilter(50,BlurMaskFilter.Blur.NORMAL);
       mPaint.setMaskFilter(blurMaskFilterNORMAL);
        canvas.drawBitmap(bitmapone,50,200,mPaint);

//EmbossMaskFilter 方式
this.setLayerType(LAYER_TYPE_SOFTWARE, null);
        //direction 是一个 3 个元素的数组,指定了光源的方向; ambient 是环境光的强度,数值范围是 0 到 1; specular 是炫光的系数; blurRadius 是应用光线的范围。
        EmbossMaskFilter embossMaskFilter =  new EmbossMaskFilter(new float[]{10, 10, 10}, 0.1f, 5, 5);
       mPaint.setMaskFilter(embossMaskFilter);
        canvas.drawText("Test",100,700,mPaint);