android 资源之 color

来源:互联网 发布:静态个人引导页源码 编辑:程序博客网 时间:2024/05/18 03:30

文章出处:http://blog.csdn.net/shift_wwx

请转载的朋友标明出处~~


前言:对于color 资深的Android 工程师肯定都熟悉,我是记忆力太差了,随记一下。


Android中使用4个数字来表示颜色,分别是alpha、红(red)、绿(green)、蓝(blue)四个颜色值(ARGB)。每个数字取值0-255,因此一个颜色可以用一个整数来表示。为了运行效率,Android编码时用整数Color类实例来表示颜色。

红、绿、蓝三个值是就是代表颜色的取值,而Alpha代表的是透明度。最低值为0,表示颜色完全透明,而此时RGB是什么取值都不重要了。Alpha最高可取值为255,表示颜色完全不透明。如果需要颜色透明、半透明,那么可以取值0-255中间的一些值,这常常用在前端图层绘制时。

下面我大概列了两个方面理解color:

一、Color 类
在android中有个Color 类,路径大概在frameworks/base/graphics/java/android/graphics/下。里面定义了一下 color。
    public static final int BLACK       = 0xFF000000;    public static final int DKGRAY      = 0xFF444444;    public static final int GRAY        = 0xFF888888;    public static final int LTGRAY      = 0xFFCCCCCC;    public static final int WHITE       = 0xFFFFFFFF;    public static final int RED         = 0xFFFF0000;    public static final int GREEN       = 0xFF00FF00;    public static final int BLUE        = 0xFF0000FF;    public static final int YELLOW      = 0xFFFFFF00;    public static final int CYAN        = 0xFF00FFFF;    public static final int MAGENTA     = 0xFFFF00FF;    public static final int TRANSPARENT = 0;
需要注意的是 transparent,就是alpha 为0,rgb是完全不关心的。

Color 类中还提供了其他的一些方法:
    public static int alpha(int color) {        return color >>> 24;    }    /**     * Return the red component of a color int. This is the same as saying     * (color >> 16) & 0xFF     */    public static int red(int color) {        return (color >> 16) & 0xFF;    }    /**     * Return the green component of a color int. This is the same as saying     * (color >> 8) & 0xFF     */    public static int green(int color) {        return (color >> 8) & 0xFF;    }    /**     * Return the blue component of a color int. This is the same as saying     * color & 0xFF     */    public static int blue(int color) {        return color & 0xFF;    }    /**     * Return a color-int from red, green, blue components.     * The alpha component is implicity 255 (fully opaque).     * These component values should be [0..255], but there is no     * range check performed, so if they are out of range, the     * returned color is undefined.     * @param red  Red component [0..255] of the color     * @param green Green component [0..255] of the color     * @param blue  Blue component [0..255] of the color     */    public static int rgb(int red, int green, int blue) {        return (0xFF << 24) | (red << 16) | (green << 8) | blue;    }    /**     * Return a color-int from alpha, red, green, blue components.     * These component values should be [0..255], but there is no     * range check performed, so if they are out of range, the     * returned color is undefined.     * @param alpha Alpha component [0..255] of the color     * @param red   Red component [0..255] of the color     * @param green Green component [0..255] of the color     * @param blue  Blue component [0..255] of the color     */    public static int argb(int alpha, int red, int green, int blue) {        return (alpha << 24) | (red << 16) | (green << 8) | blue;    }    /**     * Returns the hue component of a color int.     *      * @return A value between 0.0f and 1.0f     *      * @hide Pending API council     */    public static float hue(int color) {        int r = (color >> 16) & 0xFF;        int g = (color >> 8) & 0xFF;        int b = color & 0xFF;        int V = Math.max(b, Math.max(r, g));        int temp = Math.min(b, Math.min(r, g));        float H;        if (V == temp) {            H = 0;        } else {            final float vtemp = (float) (V - temp);            final float cr = (V - r) / vtemp;            final float cg = (V - g) / vtemp;            final float cb = (V - b) / vtemp;            if (r == V) {                H = cb - cg;            } else if (g == V) {                H = 2 + cr - cb;            } else {                H = 4 + cg - cr;            }            H /= 6.f;            if (H < 0) {                H++;            }        }        return H;    }    /**     * Returns the saturation component of a color int.     *      * @return A value between 0.0f and 1.0f     *      * @hide Pending API council     */    public static float saturation(int color) {        int r = (color >> 16) & 0xFF;        int g = (color >> 8) & 0xFF;        int b = color & 0xFF;        int V = Math.max(b, Math.max(r, g));        int temp = Math.min(b, Math.min(r, g));        float S;        if (V == temp) {            S = 0;        } else {            S = (V - temp) / (float) V;        }        return S;    }    /**     * Returns the brightness component of a color int.     *     * @return A value between 0.0f and 1.0f     *     * @hide Pending API council     */    public static float brightness(int color) {        int r = (color >> 16) & 0xFF;        int g = (color >> 8) & 0xFF;        int b = color & 0xFF;        int V = Math.max(b, Math.max(r, g));        return (V / 255.f);    }
可以获取 int alpha,int red,int green, int blue;
也可以通过分别传入r、g、b获取最终的argb,或者是传入a、r、g、b 获取最终的argb;
还可以通过传入的rgb 获取色度(h)、饱和度(s)、亮度(b);
还有一些rgb 和 hsb之间的转换等等。

例如:
int color = Color.rgb(100, 200, 255);
这个时候alpha 是FF。
int color = Color.argb(100, 100, 200, 255);
加了透明色的color。
但是一般这些如果在code中写死的话,项目的兼容性就不怎么好,还是在资源用配置比较好,项目之间可以通过overlay 来继承。


二、应用中的color
可以在values中new 一个color.xml:
<?xml version="1.0" encoding="utf-8"?><resources>    <color name="source_unfocus">#1E1E1E</color>    <color name="source_focus">#FFFFFF</color>    <color name="source_unselect">#5D5D5D</color>    <color name="no_signal">#1E1E1E</color>    <color name="source_info_ha">#1E1E1E</color></resources>
这样可以在code中用:
int color = getResources().getColor(R.color.source_unfocus);
也可以直接在资源的xml中用;
@color/source_unfocus

当然一些View中color 也是可以动态变的。例如:
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android" >    <item android:state_focused="true"        android:color="@color/source_focus" />    <item android:state_focused="false"        android:color="@color/source_unfocus"/>    <item android:state_selected="false"        android:color="@color/source_unselect"/></selector>
当然啦,也可以用shape,详细看一下:《android资源文件之:shape详解




0 0
原创粉丝点击