美文网首页
Paint颜色相关

Paint颜色相关

作者: jadefly | 来源:发表于2018-11-15 18:02 被阅读0次

    颜色相关:color、shader、colorFilter、Xfermode


    1.直接设置颜色

    setColor(int color)

    setARGB(int a, int r, int g, int b)参数为透明度及三原色


    2.设置着色器

    着色器:图形领域里一个通用的概念,是一种颜色方案或着色规则。

    setShader(Shader shader)

    Shader.TileMode:端点范围之外的着色规则

    CLAMP:在端点之外延续端点处的颜色(即超出边缘使用边缘处颜色)

    MIRROR:镜像模式

    REPEAT:重复模式

    平铺方式

    LinearGradient 线性渐变

    简介:设置两个点作为端点,使用两个或一组颜色实现颜色的渐变效果。

    构造:LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile) 。

               LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile);

    参数:x0 y0 x1 y1:渐变的两个端点的位置 

               color0,color1,int[] colors:两个或一组颜色

               positions:颜色数组的相对位置

               tile:平铺方式

    RadialGradient 辐射渐变

    简介:从中心向周围辐射状的渐变。

    构造方法: RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, TileMode tileMode);

                       RadialGradient (float x, float y, float radius, int[] colors, float[] positions, Shader.TileMode tile);

    参数:centerX centerY:辐射中心的坐标 

               radius:辐射半径 

               centerColor,edgeColor,int[] colors:辐射中心、边缘的颜色或一组颜色

    SweepGradient 扫描、梯度渐变

    简介:以某个点位中心旋转一周所形成的效果。

    构造:SweepGradient(float cx, float cy, int color0, int color1)

               SweepGradient (float cx, float cy, int[] colors, float[] positions);

    参数:cx cy :扫描的中心

               color0,color1,colors:起始颜色或颜色数组

    BitmapShader 位图着色

    简介:用 Bitmap 的像素来作为图形或文字的填充。

    构造方法: BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)

    参数: bitmap:用来做模板的 Bitmap 对象 

                tileX:X轴方向上位图的衔接形式

                tileY:Y轴方向上位图的衔接形式

    ComposeShader混合着色器

    简介:着色效果的叠加,比如将BitmapShader与LinearGradient的混合渲染 。

    构造:ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode);

    参数:shaderA, shaderB:两个相继使用的 Shader 

               mode:两个 Shader 的叠加模式

    使用

    使用

    3.颜色过滤

    简介:为绘制的内容设置一个统一的过滤策略,然后 Canvas.drawXXX() 方法会对每个像素都进行过滤后再绘制出来。

    setColorFilter(ColorFilter colorFilter)

    颜色相关知识

    光的三原色:红、绿、蓝(三色相加是白色,所以是加色模式,即黑色环境中用光后环境变亮)

    色(颜料)的三原色:红、黄、蓝(三色相加是黑色,所以是减色模式,即在白色材料上使用颜料后让它变暗了)

    RGBA模型:R(Red红色),G(Green绿色),B(Blue蓝色),A(Alpha透明度)

    色调(色相/颜色):物体的颜色

    饱和度(彩度):色彩的鲜艳度。颜色的纯度:0(灰)~100%(饱和)

    亮度(明度):眼睛对光源和物体表面的明暗程度的感觉,主要是由光线强弱决定的一种视觉经验

    LightingColorFilter 光照色彩过滤器

    简介:通过改变光照来实现颜色过滤,可以用来模拟简单的灯光效果。

    构造:LightingColorFilter(int mul, int add)

    参数:mul:色彩倍增,用来和目标像素相乘

               add:色彩添加,用来和目标像素相加(都是16进制的色彩值)

    算法: (RGB值 * mul + Add) % 255,从而得到新的RPG值,整个过程中Alpha不参与改变;

    PorterDuffColorFilter混排颜色过滤器

    简介:通过指定具体颜色值和PorterDuff混合模式来实现图片颜色的改变。

    构造:PorterDuffColorFilter(int color, PorterDuff.Mode mode) 

    使用:paint.setColorFilter(new PorterDuffColorFilter(color,mode));

               img.setColorFilter(new PorterDuffColorFilter(color,mode));

    效果

    ColorMatrixColorFilter颜色矩阵过滤器

    ColorMatrix颜色矩阵:是(4 * 5)的一个颜色矩阵,1~4行定义RGBA,第五列定义颜色偏移量

    矩阵 简单使用

    使用封好的api修改颜色矩阵:

    setRotate(int axis, float degrees):设置色调

    setSaturation(float sat):设置饱和度

    setScale(float rScale, float gScale, float bScale, float aScale):设置亮度

    api使用

    4.处理源图像和 View 已有内容的关系(混合计算方式)

    setXfermode(Xfermode xfermode)

    Xfermode:指的是你要绘制的内容和 Canvas 的目标位置的内容应该怎样结合计算出最终的颜色

    PorterDuff.Mode:用来指定两个图像共同绘制时的颜色策略。(目前只有这个子类)

    18种模式

    在API中Android为我们提供了18种模式(比上图多了两种ADD和OVERLAY)

    1.Alpha 合成 (Alpha Compositing):PorterDuff算法(描述了12种关于 Alpha 通道将两个图像共同绘制的操作)

    2.混合 (Blending):操作颜色的本身Photoshop软件里的那些模式(与Alpha、PorterDuff无关,属于Google官方加入的)

    CLEAR:清除图像

    SRC:只显示源图像

    DST:只显示目标图像

    SRC_OVER:将源图像放在目标图像上方

    DST_OVER:将目标图像放在源图像上方

    SRC_IN:只在源图像和目标图像相交的地方绘制【源图像】

    DST_IN:只在源图像和目标图像相交的地方绘制【目标图像】,绘制效果受到源图像对应地方透明度影响

    SRC_OUT:只在源图像和目标图像不相交的地方绘制【源图像】,

                         相交的地方根据目标图像的对应地方的alpha进行过滤,目标图像完全不透明则完全过滤,完全透明则不过滤

    DST_OUT:只在源图像和目标图像不相交的地方绘制【目标图像】,

                         在相交的地方根据源图像的alpha进行过滤,源图像完全不透明则完全过滤,完全透明则不过滤

    SRC_ATOP:在源图像和目标图像相交的地方绘制【源图像】,在不相交的地方绘制【目标图像】,

                           相交处的效果受到源图像和目标图像alpha的影响

    DST_ATOP:在源图像和目标图像相交的地方绘制【目标图像】,在不相交的地方绘制【源图像】,

                           相交处的效果受到源图像和目标图像alpha的影响

    XOR:在源图像和目标图像相交的地方之外绘制它们,在相交的地方受到对应alpha和色值影响,如果完全不透明则相交处完全不绘制

    DARKEN:变暗,较深的颜色覆盖较浅的颜色,若两者深浅程度相同则混合

    LIGHTEN:变亮,与DARKEN相反,DARKEN和LIGHTEN生成的图像结果与Android对颜色值深浅的定义有关

    MULTIPLY:正片叠底,源图像素颜色值乘以目标图像素颜色值除以255得到混合后图像像素颜色值

    SCREEN:滤色,色调均和,保留两个图层中较白的部分,较暗的部分被遮盖

    ADD:饱和相加,对图像饱和度进行相加,不常用

    OVERLAY:叠加

    离屏缓冲(Off-screen Buffer)

    简介:把内容绘制在额外的缓冲层上,再把绘制好的内容贴回 View 中(解决直接绘制View层时范围外区域为黑色的问题)

    两种方式:

    1.Canvas.saveLayer():可以做短时的离屏缓冲

        int saved = canvas.saveLayer(null, null, Canvas.ALL_SAVE_FLAG);

        canvas.drawXXX();

        canvas.restoreToCount(saved);

    2.View.setLayerType():直接把整个 View 都绘制在离屏缓冲中

        setLayerType(LAYER_TYPE_HARDWARE):使用 GPU 来缓冲

        setLayerType(LAYER_TYPE_SOFTWARE) :直接用一个 Bitmap 来缓冲

    控制好透明区域

    由于透明区域过小而覆盖不到的地方,将不会受到 Xfermode 的影响

    相关文章

      网友评论

          本文标题:Paint颜色相关

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