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:重复模式

平铺方式

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 的影响
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342