简介
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);