笔记—自定义Veiw之Paint详解

Paint基本API四类

paint基本API分四个大类:1 颜色,2 效果,3 drawText相关paint设置,4 初始化

一 颜色

颜色设置分三个方式:1 基本颜色设置,2 ColorFilter,3 setXfermode

1 基本颜色设置

基本设置分为两种:1 直接设置颜色,2 设置着色器

1 直接设置颜色

 1 paint.setColor()            
 2 paint.setARGB()

2 设置着色器 Paint.setShader(Shader shader)
着色规则: Shader.TileMode.CLAMP 夹子模式 Shader.TileMode.MIRROR 镜像模式 Shader.TileMode.REPEAL 重复模式
着色器5个子类:1线性渐变 LinearGradient 2辐射渐变 RadialGradient 3 扫描渐变 SweepGradient 4 BitmapShader 5 ComposeShader

1 线性渐变 LinearGradient  起点  重点  起始颜色  终止颜色  渐变规则
        val shader = LinearGradient(0f, 100f, 0f, 500f, Color.RED, Color.BLUE, Shader.TileMode.MIRROR)
        val paint1 = Paint()
        paint1.shader = shader
        canvas.drawCircle(600f, 600f, 600f, paint1)

2 辐射渐变 RadialGradient  辐射中心的坐标 x y   渐变起始颜色 渐变终止颜色   渐变规则  
        val shader = RadialGradient(0f, 0f, 500f, Color.RED, Color.BLUE, Shader.TileMode.REPEAT)
        val paint2 = Paint()
        paint2.shader = shader
        canvas.drawCircle(500f, 500f, 500f, paint2)  

3 扫描渐变 SweepGradient  扫描中点的坐标 x y  渐变起始颜色  渐变终止颜色
        val shader = SweepGradient(500f, 500f, Color.RED, Color.BLUE)
        val paint3 = Paint()
        paint3.shader = shader
        canvas.drawCircle(500f, 500f, 500f, paint3)
4 BitmapShader 图像着色(不再是渐变)就是用bitmap的像素作为文字或者图片的填充 这个着色方案可以 自定义圆形头像控件
        val bitmap = BitmapFactory.decodeResource(resources, R.drawable.test)
        val shader = BitmapShader(bitmap, Shader.TileMode.MIRROR, Shader.TileMode.CLAMP)
        val paint4 = Paint(Paint.ANTI_ALIAS_FLAG)
        paint4.shader = shader 
        canvas.drawCircle(500f, 500f, 500f, paint4)   

5 混合着色器 ComposeShader 结合两个着色器 结合规则麻烦 就不细说  
        第一个Shader
        val bitmap1 = BitmapFactory.decodeResource(resources, R.drawable.test)
        val shader1 = BitmapShader(bitmap1, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)

        第二个 Shader:从上到下的线性渐变(由透明到黑色)
        val bitmap2 = BitmapFactory.decodeResource(resources, R.drawable.timg)
        val shader2 = BitmapShader(bitmap2, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)

        ComposeShader:结合两个 Shader
        val shader = ComposeShader(shader1, shader2, PorterDuff.Mode.SRC_OVER)
        val paint5 = Paint()
        paint5.shader = shader
        canvas.drawCircle(500f, 500f, 500f, paint5)        
2 ColorFilter

ColorFilter 这个类,它的名字已经足够解释它的作用:为绘制设置颜色过滤。颜色过滤的意思,就是为绘制的内容设置一个统一的过滤策略,然后 Canvas.drawXXX() 方法会对每个像素都进行过滤后再绘制出来。应用场景:有色光照射 有色玻璃透色 胶卷
ColorFilter 有三个子类 LightingColorFilter PorterDuffColorFilter ColorMatrixColorFilter

1 LightingColorFilter
  LightingColorFilter 的构造方法是 LightingColorFilter(int mul, int add) ,参数里  的 muladd 都是和颜色值格式相同的 int 值 其中 mul 用来和目标像素相乘,add 用来和目标像素相加:
  LightingColorFilter filter1 = new LightingColorFilter(0x00ffff,0x000000);
  paint.setColorFilter(filter1);
  canvas.drawBitmap(bitmap, 0, 0, paint);

2 PorterDuffColorFilter 
  PorterDuffColorFilter 的作用是使用一个指定的颜色和一种指定的 PorterDuff.Mode 来与绘制对象进行合成。它的构造方法是 PorterDuffColorFilter(int color, PorterDuff.Mode mode) 其中的 color 参数是指定的颜色,mode 参数是指定的 Mode。同样也是 PorterDuff.Mode ,不过和 ComposeShader 不同的是,PorterDuffColorFilter 作为一个 ColorFilter,mode 参数是指定的 Mode。同样也是 PorterDuff.Mode ,不过和 ComposeShader 不同的是,PorterDuffColorFilter 作为一个 ColorFilter

3 ColorMatrixColorFilter
  ColorMatrixColorFilter 使用一个 ColorMatrix 来对颜色进行处理 ColorMatrix 这个类,  内部是一个 4x5 的矩阵
  设置饱和度
        ColorMatrix matrix = new ColorMatrix();
        matrix.setSaturation(0f);
        ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
        paint.setColorFilter(filter);
        canvas.drawBitmap(bitmap, 0, 0, paint);
3 setXfermode

Xfermode” 其实就是 “Transfer mode”,用 “X” 来代替 “Trans” 是一些美国人喜欢用的简写方式 严谨地讲, Xfermode 指的是你要绘制的内容和 Canvas 的目标位置的内容应该怎样结合计算出最终的颜色 但通俗地说,其实就是要你以绘制的内容作为源图像,以 View 中已有的内容作为目标图像 选取一个 PorterDuff.Mode 作为绘制内容的颜色处理方案

二 效果

1 设置抗锯齿 paint.setAntiAlias (boolean aa) val paint= Paint(Paint.ANTI_ALIAS_FLAG) ,使绘制的图片边缘更圆滑
2 设置style paint.setStyle(Paint.Style style)
1 paint.setStyle(Paint.Style.FILL); // FILL 模式,填充
2 paint.setStyle(Paint.Style.STROKE); // STROKE 模式,画线
3 设置线条形状 paint.setStrokeX()
1 设置线条宽度 paint.setStrokeWith()
2 设置线条头部样式 paint.setStrokeCap(Paint.Cap cap) 
  样式有三种:BUTT 平头、ROUND 圆头、SQUARE 方头。默认为 BUTT 比如画点的时设置 圆点 还是方点
3 设置线条拐角样式 paint.setStrokeJoin(Paint.Join join) 
  样式有三个值可以选择:MITER 尖角、 BEVEL 平角和 ROUND 圆角。默认为 MITER。
4 线条拐角设置为尖角时的补充 paint.setStrokeMiter(float miter)
4 设置色彩优化
1 paint.setDither(boolean dither) 设置图像的抖动
2 paint.setFilterBitmap(boolean filter) 设置是否使用双线性过滤来绘制 Bitmap
5 图像轮廓设置paint.setPathEffect(PathEffect effect)
单一效果
1 CornerPathEffect 把所有拐角变成圆角。
2 DiscretePathEffect 线条进行随机的偏离,让轮廓变得乱七八糟。乱七八糟的方式和程度由参数决定。
3 DashPathEffect 使用虚线来绘制线条
4 PathDashPathEffect 这个方法比 DashPathEffect 多一个前缀 Path ,所以顾名思义,它是使用一个 Path 来绘制「虚线 把所有拐角变成圆角。
组合效果
5 SumPathEffect 这是一个组合效果类的 PathEffect 。它的行为特别简单,就是分别按照两种 PathEffect 分别对目标进行
6 ComposePathEffect 这也是一个组合效果类的 PathEffect 。不过它是先对目标 Path 使用一个 PathEffect,然后再对这个改变后的 Path 使用另一个 PathEffect。

注意:PathEffect 在有些情况下不支持硬件加速,需要关闭硬件加速才能正常使用:
Canvas.drawLine() 和 Canvas.drawLines() 方法画直线时,setPathEffect() 是不支持硬件加速的;
PathDashPathEffect 对硬件加速的支持也有问题,所以当使用 PathDashPathEffect 的时候,最好也把硬件加速关了。
6 在绘制图形下面加一层阴影 paint.setShadowLayer(float radius, float dx, float dy, int shadowColor)
注意:
在硬件加速开启的情况下, setShadowLayer() 只支持文字的绘制,文字之外的绘制必须关闭硬件加速才能正常绘制阴影。如果 shadowColor 是半透明的,阴影的透明度就使用 shadowColor 自己的透明度;而如果 shadowColor 是不透明的,阴影的透明度就使用 paint 的透明度。
7 在绘制层上方的附加效果 paint.setMaskFilter(MaskFilter maskFilter)
1 BlurMaskFilter 模糊效果的
四种模糊的类型:NORMAL: 内外都模糊绘制  SOLID: 内部正常绘制,外部模糊  INNER: 内部模糊,外部不绘制   OUTER: 内部不绘制,外部模糊
2 MaskFilter 浮雕效果的
8 根据 paint 的设置,计算出绘制 Path 或文字时的实际 Path。 Path.getXXPath()
1 paint.getFillPath(Path src, Path dst) 获取实际path src 原有path  dst实际path
2 paint.getTextPath(。。。) 获取的就是目标文字所对应的 Path 。这个就是所谓「文字的 Path」。

三 drawText相关paint设置

1 设置文字大小 paint.setTextSize()
2 设置文字间隔 paint.setLetterSpacing(float letterSpacing)

……

四 Paint初始化

1 Paint.reset() 重置 Paint 的所有属性为默认值。相当于重新 new 一个,不过性能当然高一些啦。
2 Paint.set(Paint src) 把 src 的所有属性全部复制过来。相当于调用 src 所有的 get 方法,然后调用这个 Paint 的对应的 set 方法来设置它们。
3 Paint.setFlags(int flags) 批量设置 flags。相当于依次调用它们的 set 方法。例如: paint.flags = Paint.ANTI_ALIAS_FLAG and Paint.DITHER_FLAG
4 Paint.reset() 重置paint相关属性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值