3

在应用程序的res/values/colors.xml文件中,红色以#AARRGGBB格式定义:

    <color name="red">#ffff0000</color>

如何将此颜色用作 glClearColor 和其他 OpenGL ES 函数的参数?例如:

     public void onSurfaceCreated(GL10 unused, EGLConfig config) {
         GLES20.glClearColor(1.0f, 0.0f, 0.0f, 1.0f); // <-- How to connect R.color.red here? 
     }
4

3 回答 3

5

该类Color具有支持这一点的静态方法。如果strColor是字符串格式的颜色,可以是#RRGGBB,#AARRGGBB或颜色的名称,您可以使用以下命令将其转换为 OpenGL 所需的值:

int intColor = Color.parseColor(strColor);
GLES20.glClearColor(Color.red(intColor) / 255.0f,
                    Color.green(intColor) / 255.0f,
                    Color.blue(intColor) / 255.0f);
于 2014-06-15T14:39:18.080 回答
3

您应该使用移位来隔离各个字节,将它们转换为浮点数,然后除以将它们缩小到 0.0f 到 1.0f 的范围内。它应该如下所示:

   unsigned long uColor; // #AARRGGBB format

    float fAlpha = (float)(uColor >> 24) / 0xFF
    float fRed = (float)((uColor >> 16) & 0xFF) / 0xFF;
    float fGreen = (float)((uColor >> 8) & 0xFF) / 0xFF;
    float fBlue = (float)(uColor & 0xFF) / 0xFF;

    GLES20.glClearColor(fRed, fGreen, fBlue, fAlpha);
于 2013-08-25T17:32:01.237 回答
0

这是我将颜色从 HEX 转换为 glClearColor() 格式的解决方案,该格式是 0 到 1 之间的浮点数。

首先,我将颜色转换为 RGB,然后将该颜色从 0 映射到 1。

/* re-map RGB colors so they can be used in OpenGL */
private float[] map(float[]rgb) {

    /* RGB is from 0 to 255 */
    /* THIS is from 0 to 1 (float) */

    // 1 : 2 = x : 4 >>> 2

    /*
    *
    * 240 : 255 = x : 1
    *
    * */

    float[] result = new float[3];
    result[0] = rgb[0] / 255;
    result[1] = rgb[1] / 255;
    result[2] = rgb[2] / 255;
    return result;
}

public float[] hextoRGB(String hex) {

    float[] rgbcolor = new float[3];
    rgbcolor[0] = Integer.valueOf( hex.substring( 1, 3 ), 16 );
    rgbcolor[1] = Integer.valueOf( hex.substring( 3, 5 ), 16 );
    rgbcolor[2] = Integer.valueOf( hex.substring( 5, 7 ), 16 );
    return map(rgbcolor);
}

用法:

    //0077AB is HEX color code
    float[] values = hextoRGB("#0077AB");

    GLES20.glClearColor(values[0], values[1], values[2], 1.0f);
于 2014-06-15T14:11:27.027 回答