美文网首页
Paint 应用

Paint 应用

作者: 佼佼者Mr | 来源:发表于2019-08-29 16:42 被阅读0次

    概念

    画笔、保存了绘制几何图形,文本、位图的样式和颜色信息。

    常用api——颜色相关

    setColor(int color)参数具体色值

    setARGB(int a,int r,int g,int b)参数 透明度、红、绿、蓝。0-255数值

    setShader(Shader shader) 参数着色器对象 一般采用着色器的子类

       1.LinearGradient 线性渲染

       2.RadialGradient 环形渲染

       3.SweepGradient 扫描渲染

       4.BitmapShader 位图渲染

       5.ComposeShader 组合渲染(LinearGradient +BitmapShader )

    serColorFilter(ColorFilter filter)参数颜色过滤器 一般使用ColorFilter的子类

       1.LightingColorFilter 光照效果

       2.PorterDuffColorFilter 指定一个颜色和一种PorterDuff.Mode与绘制对象进行合成

       3.ColorMatrixColorFilter 使用一个ColorMatrix来对颜色进行处理

    看看效果:

    1.线性渲染器

    线性渲染器代码 线性渲染器效果

    position的作用是什么呢?看源码

    position的注释

    可以为空,颜色数组中每个对应颜色的相对位置[0..1],如果为空,颜色渐变线均匀分布。

    2.环形渲染器

    环形渲染器代码+效果

    3.扫描渲染器

    扫描渲染效果器+代码

    4.位图渲染器

    位图渲染器效果+代码

    这个渲染效果与TileMode有关,

    /**

    * replicate the edge color if the shader draws outside of its

    * original bounds

    */

    CLAMP  (0),

    /**

    * repeat the shader's image horizontally and vertically

    */

    REPEAT  (1),

    /**

    * repeat the shader's image horizontally and vertically, alternating

    * mirror images so that adjacent images always seam

    */

    MIRROR  (2);

    CLAMP    绘制区域超过渲染区域的部分,会以最后一个像素拉伸排版

    REPEAT  绘制区域超过渲染区域的部分,重复排版

    MIRROR  绘制区域超过渲染区域的部分,镜像翻转排版

    4.混合渲染器

    位图渲染器+线性渲染器效果+代码

    这里要说明的是ComposeShaderg构造方法最后一个参数,PorterDuff.Mode 这里有17种混合模式,每一种都是根据不同的算法计算的。照片当然也可以利用混合渲染器来处理,达到美颜的效果。

    PorterDuff.Mode.LIGHTEN效果。

    PorterDuff.Mode.LIGHTEN

    图层混合

    混合渲染器也是图层混合模式应用的一种

    1.ComposeShader

    2.Paint.setXfermode()

    3.ColorFilter

    使用图层混合模式第一步:禁止硬件加速。原因:图层混合的api有些不支持硬件加速,而Android系统默认是支持硬件加速的。

    关闭硬件加速

    离屏绘制

    也叫离屏缓冲,通过使用离屏缓冲,把要绘制的内容单独绘制在缓冲层,保证Xfermode的使用不会出现错误结果。

    离屏缓冲的应用

    图层混合模式作用效果只作用于src的原图像区域,何为源图像?

    src源图像 蓝色矩形区域就是src区域

    蓝色矩形区域就是源图像区域,只作用于蓝色矩形和重合区域。

    不同模式分别对应的不同的显示效果

    前面讲的不同的17中混合模式对应的不同的显示效果。

    针对PorterDuff.Mode.SRC_OUT来做一个刮刮卡的效果

    关键demo

    离屏绘制和事件的代码

    LightingColorFilter滤镜

    构造方法

    LightingColorFilter(int mul,int add)

    参数mul和add都是和颜色值格式相同的int值,其中mul用来和目标像素相乘,add用来和目标像素相加。

    RGB代表颜色的三原色,红,绿,蓝,x后面每两位代表相应的色值

    原图效果

    mul和add都是原色。

    new LightingColorFilter(0xffffff,0x000030)效果图

    add蓝色从00改为30,是不是肤白貌美了许多呢?add值代表更亮,mul代表过滤对应的颜色

    new LightingColorFilter(0xffff00,0x000000)效果图

    mul B色系由ff改为00,过滤掉蓝色是不是暖洋洋了许多。

    PorterDuffColorFilter滤镜

    PorterDuffColorFilter滤镜和前面setXfermode里面mode一样,设置对应的图层模式

    PorterDuffColorFilter的使用

    通过构造器可知差别之处在于PorterDuffColorFilter是一张位图和和颜色的过滤,而setXfermode是拿两张位图进行图层混合。

    ColorMatrixColorFilter滤镜

    使用方法

    通过一个数组,数组的长度是20位,将他分成一个四行五列,代表不同的颜色数据,只要改变代表不同颜色数据的数值就可以改变图片中颜色的比例。

    第一列决定了颜色值中的红色,第二列代表了颜色值中的绿色,第三列代表了颜色值中的蓝色,第四列代表了透明度。第五列代表了偏移量offset

    矩阵数组对图片的处理

    将第一列的红色通道的初始值从1改为2之后的显示效果,这样就可以根据不同的需求,对应不同的算法,达到不同的效果。

    胶片的算法

    ColorMatrix

    这个类呢也可以对ColorMatrixColorFilter进行操作,其实和上面的矩阵原理是一样的,无非就是谷歌工程师对这个数组进行了一层封装而已。

    setScale()方法

    通过源码可知,通过循环将传入的参数修改矩阵数组的索引值,达到修改显示效果的目的。

    Paint相关知识就整理完了,常用的滤镜算法请面向百度。

    相关文章

      网友评论

          本文标题:Paint 应用

          本文链接:https://www.haomeiwen.com/subject/yahlectx.html