【5年Android从零复盘系列之十一】Android自定义View(6):画笔Paint
发布日期:2021-06-29 18:17:43
浏览次数:2
分类:技术文章
本文共 7021 字,大约阅读时间需要 23 分钟。
简介
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 = newSumPathEffect(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:结合两个 ShaderShader 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); // 设置 Xfermodecanvas.drawBitmap(bitmapone, 0, 0, paint); paint.setXfermode(null); // 用完及时清除 Xfermodecanvas.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);
转载地址:https://cupster.blog.csdn.net/article/details/112617576 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2024年04月30日 04时24分34秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
在图像变换中用最小二乘法求解仿射变换参数
2019-04-29
软件包应用分享|基于RT-Thread的百度语音识别(一)
2019-04-29
12月8日 RCEA - RT-Thread能力认证考试考前通知
2019-04-29
论坛热贴 | RT-Thread音频驱动开发(一)
2019-04-29
基于 Keil MDK 移植 RT-Thread Nano
2019-04-29
【报名截至今晚】12月14日深圳嵌入式与音频开发专题会议预告
2019-04-29
移植 RT-Thread Nano 到 RISC-V
2019-04-29
软件包应用分享|基于RT-Thread的百度语音识别(二)
2019-04-29
在 RT-Thread Nano 上添加控制台与 FinSH
2019-04-29
一站式开发工具:RT-Thread Studio 正式发布
2019-04-29
留言有礼|谢谢你悄悄点了小星星,让我们跃居GitHub RTOS Star榜第一
2019-04-29
功能更新!C 函数也能在 MicroPython 中被调用啦
2019-04-29
东软载波携ES32+RT-Thread走进海尔集团
2019-04-29
今晚8点直播预告:RT-Thread Studio等相关主题答疑
2019-04-29
物联网 20 年简史大揭秘!
2019-04-29
开源项目|RT-Thread 软件包应用作品:水墨屏桌面台历
2019-04-29
珠联璧合!基于i.MX RT和RT-Thread的物联网云接入方案
2019-04-29
基于RTT-MicroPython制作自带BGM的新型肺炎晴雨表
2019-04-29