Paint颜色相关

颜色相关: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:重复模式

Paint颜色相关_第1张图片
平铺方式

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 的叠加模式

使用

Paint颜色相关_第2张图片
使用

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

Paint颜色相关_第3张图片
效果

ColorMatrixColorFilter颜色矩阵过滤器

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

Paint颜色相关_第4张图片
矩阵
Paint颜色相关_第5张图片
简单使用

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

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

setSaturation(float sat):设置饱和度

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

Paint颜色相关_第6张图片
api使用

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

setXfermode(Xfermode xfermode)

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

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

Paint颜色相关_第7张图片
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 来缓冲

控制好透明区域

Paint颜色相关_第8张图片
由于透明区域过小而覆盖不到的地方,将不会受到 Xfermode 的影响

你可能感兴趣的:(Paint颜色相关)