是Android的自定义View-基础知识-颜色

颜色

颜色这个概念,对于程序员来说并不是那么熟悉,本文将对颜色的相关概念做一个较为详细的介绍。

颜色模式

颜色模式 备注
ARGB8888 四通道高精度(32位)
ARGB4444 四通道低精度(16位)
RGB565 屏幕默认模式(16位)
Alpha8 仅有透明通道(8位)

以ARGB8888为例介绍颜色定义:

类型 解释 0(0x00) 255(0xff)
A(Alpha) 透明度 透明 不透明
R(Red) 红色 无色 红色
G(Green) 绿色 无色 绿色
B(Blue) 蓝色 无色 蓝色

其中 A R G B 的取值范围均为0 ~ 255(即16进制的0x00~0xff)

A 从0x00到0xff表示从透明到不透明。
RGB 从0x00到0xff表示颜色从浅到深。

当RGB全取最小值(0或0x000000)时颜色为黑色,全取最大值(255或0xffffff)时颜色为白色

创建颜色的方法

Color给出几种颜色

val color = Color.BLACK            //黑色
val color = Color.DKGRAY           //深灰色
val color = Color.GRAY             //灰色
val color = Color.LTGRAY           //亮灰色
val color = Color.WHITE            //白色
val color = Color.RED              //红色
val color = Color.GREEN            //绿色
val color = Color.BLUE             //蓝色
val color = Color.YELLOW           //黄色
val color = Color.CYAN             //青色
val color = Color.MAGENTA          //品红色
val color = Color.TRANSPARENT      //透明

代码中定义

val color = Color.argb(127, 255, 0, 0)   //半透明红色
val color = 0xaaff0000          //带有透明度的红色

/res/values/color.xml中定义

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="red">#ff0000</color>
    <color name="green">#00ff00</color>
</resources>

几种不同的定义方式:

#f00            //低精度 - 不带透明通道红色
#af00           //低精度 - 带透明通道红色

#ff0000         //高精度 - 不带透明通道红色
#aaff0000       //高精度 - 带透明通道红色

在代码中引用定义的颜色的方法:

public static int getColor(@NonNull Context context, @ColorRes int id) {
    if (Build.VERSION.SDK_INT >= 23) {
        return context.getColor(id);
    } else {
        return context.getResources().getColor(id);
    }
}

Android给出了一个兼容方法来兼容不同版本下的颜色获取,可以根据对应SDK版本来使用不同的方式。

在xml中引用或创建颜色:

<!--在style文件中引用-->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimary">@color/red</item>
</style>

android:background="@color/red"     //引用在/res/values/color.xml 中定义的颜色
android:background="#ff0000"        //创建并使用颜色

颜色混合模式

因为我们的显示屏是没法透明的,因此最终显示在屏幕上的颜色里可以认为没有Alpha通道。Alpha通道主要在两个图像混合的时候生效。

默认情况下,当一个颜色绘制到Canvas上时的混合模式是这样计算的:
(RGB通道) 最终颜色 = 绘制的颜色 + (1 - 绘制颜色的透明度) × Canvas上的原有颜色

下表是各个PorterDuff模式的混合计算公式:(D指原本在Canvas上的内容dst,S指绘制输入的内容src,a指alpha通道,c指RGB各个通道)

PorterDuff.Mode 算法 作用
CLEAR [0, 0] 图像的alpha和rgb值均为0
SRC [Sa, Sc] 取源图像的值
DST [Da, Dc] 取目标图像的值
SRC_OVER [Sa + (1 - Sa)Da, Rc = Sc + (1 - Sa)Dc] 结果是Src盖在了Dst上。注意alpha值的影响,不一定是这个结果
DST_OVER [Sa + (1 - Sa)Da, Rc = Dc + (1 - Da)Sc] 结果是Dst盖在了Src上。注意alpha值的影响,不一定是这个结果
SRC_IN [Sa * Da, Sc * Da] 结果是在Src色值不为0的地方,且Dst透明值不为0的地方能看到合成图像
DST_IN [Sa * Da, Sa * Dc] 结果是在Dst色值不为0的地方,且Src透明值不为0的地方能看到合成图像
SRC_OUT [Sa * (1 - Da), Sc * (1 - Da)] 结果是在Src色值不为0,且Dst透明值不为1的地方能看到合成图像
DST_OUT [Da * (1 - Sa), Dc * (1 - Sa)] 结果是在Dst色值不为0,且Src透明值不为1的地方能看到合成图像
SRC_ATOP [Da, Sc * Da + (1 - Sa) * Dc] 结果是在Src和Dst色值不同时为0,且Dst透明值不为0,且当Src色值为0但Src透明值不为1的地方能看到合成图像
DST_ATOP [Sa, Sa * Dc + Sc * (1 - Da)] 结果是在Src和Dst色值不同时为0,且Src透明值不为0,且当Dst色值为0但Dst透明值不为1的地方能看到合成图像
XOR [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc] 在不相交的地方按原样绘制源图像和目标图像,相交的地方受到对应alpha和色值影响
DARKEN [Sa + Da - SaDa, Sc(1 - Da) + Dc*(1 - Sa) + min(Sc, Dc)] 取较暗的透明值,色值计算相对复杂
LIGHTEN [Sa + Da - SaDa, Sc(1 - Da) + Dc*(1 - Sa) + max(Sc, Dc)] 取较亮的透明值,色值计算相对复杂
MUTIPLY [Sa * Da, Sc * Dc] 结果是在Src和Dst透明值均不为0,且色值均不为0的地方能看到合成图像
SCREEN [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc] 可以看到,它可能有多种情况,需要实际计算
ADD Saturate(S + D)
OVERLAY

混合效果图:

颜色混合模式

具体的关于颜色混合模式,会在之后的文章中重点讲解,本文就只做一个概要。

总结

颜色其实还有很多很深入的知识点,对于我们做Android开发的程序员来说,以上的知识点基本就足够了,更多有趣的内容可以咨询一下公司的设计妹子,盯~~~

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

推荐阅读更多精彩内容