【问题标题】:How to get a Color from hexadecimal Color String如何从十六进制颜色字符串中获取颜色
【发布时间】:2011-07-12 00:56:21
【问题描述】:

我想使用诸如"#FFFF0000" 之类的十六进制字符串中的颜色来(比如说)更改布局的背景颜色。 Color.HSVToColor 看起来像是赢家,但它需要 float[] 作为参数。

我是否接近解决方案?

【问题讨论】:

标签: android colors hex


【解决方案1】:

试试Color类方法:

public static int parseColor (String colorString)

来自Android documentation

支持的格式有:#RRGGBB #AARRGGBB 'red'、'blue'、'green'、'black'、'white'、'gray'、'cyan'、'magenta'、'yellow'、'lightgray' , '深灰色'

AndroidX:String.toColorInt()

【讨论】:

  • 有人知道如何解析#000 值吗?
  • 是的,就这样做:if(colorString.length() == 4) { colorString = "#" + StringUtils.repeat(colorString.substring(1, 1), 1) + StringUtils.repeat(colorString.substring(2, 2), 1) + StringUtils.repeat(colorString.substring(3, 3), 1) },如果我错了,请纠正我
  • 要添加到@xdevs23 代码,将if 条件更改为:if(colorString.length() == 4 && colorString[0] == '#')
  • 您的答案会更好,如果您不仅显示功能,而且如何使用它:MyView.setBackgroundColor(Color.parseColor("#123456");
  • int red = colorString.charAt(1) == '0' ? 0:255; int blue = colorString.charAt(2) == '0' ? 0:255; int green = colorString.charAt(3) == '0' ? 0:255; Color.rgb(红、蓝、绿);
【解决方案2】:

试试:

myLayout.setBackgroundColor(Color.parseColor("#636161"));

【讨论】:

  • 如果你使用的是 xamarin.. 代码是这个 Android.Graphics.Color.ParseColor("#636161") 与 "P" 到 Upper
【解决方案3】:

这个问题出现在许多与十六进制颜色相关的搜索中,所以我将在这里添加一个摘要。

int 的颜色

十六进制颜色采用RRGGBBAARRGGBB 的形式(alpha、红色、绿色、蓝色)。根据我的经验,直接使用int 时,您需要使用完整的AARRGGBB 表单。如果您只有 RRGGBB 表单,那么只需在其前面加上 FF 即可使 alpha(透明度)完全不透明。这是在代码中设置它的方法。在开头使用0x 表示它是十六进制而不是基数 10。

int myColor = 0xFF3F51B5;
myView.setBackgroundColor(myColor);

字符串颜色

正如其他人所说,您可以像这样使用Color.parseColor

int myColor = Color.parseColor("#3F51B5");
myView.setBackgroundColor(myColor);

请注意,字符串必须以# 开头。支持RRGGBBAARRGGBB 格式。

来自 XML 的颜色

您实际上应该尽可能从 XML 中获取颜色。这是推荐的选项,因为它可以更轻松地对您的应用进行颜色更改。如果您在整个代码中设置了很多十六进制颜色,那么以后尝试更改它们会很痛苦。

Android 材料设计具有已配置十六进制值的调色板。

这些主题颜色在您的整个应用程序中使用,如下所示:

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <color name="primary">#3F51B5</color>
  <color name="primary_dark">#303F9F</color>
  <color name="primary_light">#C5CAE9</color>
  <color name="accent">#FF4081</color>
  <color name="primary_text">#212121</color>
  <color name="secondary_text">#757575</color>
  <color name="icons">#FFFFFF</color>
  <color name="divider">#BDBDBD</color>
</resources>

如果您需要其他颜色,一个好的做法是在 xml 中分两步定义颜色。首先命名十六进制值颜色,然后命名应用程序中应该获得某种颜色的组件。这使得以后调整颜色变得容易。同样,这是在 colors.xml 中。

<color name="orange">#fff3632b</color>
<color name="my_view_background_color">@color/orange</color>

然后当你想在代码中设置颜色时,请执行以下操作:

int myColor = ContextCompat.getColor(context, R.color.my_view_background_color);    
myView.setBackgroundColor(myColor);

Android 预定义颜色

Color 类带有许多预定义的颜色常量。你可以这样使用它。

int myColor = Color.BLUE;
myView.setBackgroundColor(myColor);

其他颜色是

  • Color.BLACK
  • Color.BLUE
  • Color.CYAN
  • Color.DKGRAY
  • Color.GRAY
  • Color.GREEN
  • Color.LTGRAY
  • Color.MAGENTA
  • Color.RED
  • Color.TRANSPARENT
  • Color.WHITE
  • Color.YELLOW

注意事项

【讨论】:

    【解决方案4】:

    将该字符串转换为可用于setBackgroundColorsetTextColorint 颜色

    String string = "#FFFF0000";
    int color = Integer.parseInt(string.replaceFirst("^#",""), 16);
    

    16 表示它是十六进制,而不是常规的 0-9。结果应该和

    一样
    int color = 0xFFFF0000;
    

    【讨论】:

    • 如何转换字符串颜色="80000000";到 int color=?
    • 我认为字符串版本应该是#80000000,在这种情况下,int 版本应该是int color = 0x80000000;。如果这不起作用,请发布更多详细信息的new question,这样比我更多的人会注意到它。请记住#80000000 是半透明的黑色。
    • 我知道 int 将是 int color =0x80000000 但我的问题是如何转换它......但现在我将用 int color =parseColor("#"+"80000000") 解决我的问题;...感谢您的回复。
    • 我使用您的代码遇到了异常:java.lang.NumberFormatException: Invalid int: "FFFF0000"
    【解决方案5】:

    这是

    int color =  Color.parseColor("colorstring");
    

    【讨论】:

      【解决方案6】:

      试试这个:

      vi.setBackgroundColor(Color.parseColor("#FFFF0000"));
      

      【讨论】:

        【解决方案7】:

        我使用它,它非常适合我设置我想要的任何颜色。

        public static final int MY_COLOR = Color.rgb(255, 102, 153);
        

        使用 0-255 为每种红色、绿色和蓝色设置颜色,然后在您希望使用该颜色的任何位置放置 MY_COLOR 而不是 Color.BLUE 或 Color.RED 或 Color 类提供的任何其他静态颜色。

        只需在 Google 上搜索颜色图表,您就可以找到使用 0-255 的正确 RGB 代码的图表。

        【讨论】:

          【解决方案8】:

          XML 文件保存在 res/values/colors.xml:

          <?xml version="1.0" encoding="utf-8"?>
          <resources>
             <color name="opaque_red">#f00</color>
             <color name="translucent_red">#80ff0000</color>
          </resources>
          

          此应用程序代码检索颜色资源:

          Resources res = getResources();
          int color = res.getColor(R.color.opaque_red);
          

          此布局 XML 将颜色应用于属性:

          <TextView
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:textColor="@color/translucent_red"
              android:text="Hello"/>
          

          【讨论】:

            【解决方案9】:

            在 Xamarin 中 使用这个

            Control.SetBackgroundColor(global::Android.Graphics.Color.ParseColor("#F5F1F1"));
            

            【讨论】:

              【解决方案10】:

              尝试改用 0xFFF000 并将其传递给 Color.HSVToColor 方法。

              【讨论】:

              • 我希望您应该用零替换第三个 F。在OP中,我认为前两个F字符用于设置不透明度。
              【解决方案11】:

              如果您在 XML 中定义了一种颜色并想用它来更改背景颜色或其他东西,那么这个 API 就是您要寻找的:

               ((TextView) view).setBackgroundResource(R.drawable.your_color_here);
              

              在我的示例中,我将它用于 TestView

              【讨论】:

                【解决方案12】:

                对于缩短的十六进制代码

                int red = colorString.charAt(1) == '0' ? 0 : 255;
                int blue = colorString.charAt(2) == '0' ? 0 : 255;
                int green = colorString.charAt(3) == '0' ? 0 : 255;
                Color.rgb(red, green,blue);
                

                【讨论】:

                  【解决方案13】:

                  没有预定义的类可以直接实现从十六进制代码到颜色名称,所以您要做的就是尝试简单的键值对概念,遵循此代码。

                  String hexCode = "Any Hex code" //#0000FF
                  
                  HashMap<String, String> color_namme = new HashMap<String, String>();
                                          color_namme.put("#000000", "Black");
                                          color_namme.put("#000080", "Navy Blue");
                                          color_namme.put("#0000C8", "Dark Blue");
                                          color_namme.put("0000FF", "Blue");
                                          color_namme.put("000741", "Stratos");
                                          color_namme.put("001B1C", "Swamp");
                                          color_namme.put("002387", "Resolution Blue");
                                          color_namme.put("002900", "Deep Fir");
                                          color_namme.put("002E20", "Burnham");
                                          for (Map.Entry<String, String> entry : color_namme.entrySet()) {
                                              String key = (String) entry.getKey();
                                              String thing = (String) entry.getValue();
                                              if (hexCode.equals(key))
                                                  Color_namme.setText(thing); //Here i display using textview
                  
                  
                                          }

                  【讨论】:

                    【解决方案14】:

                    我已经创建了一个完整的答案:

                        /**
                         * Input: Hex Value of ARGB, eg: "#FFFF00FF", "#FF00FF", "#F0F"
                         * Output:  Float Color Array with  with red, green,
                         * blue and alpha (opacity) values,
                         * eg:  floatArrayOf(0.63671875f, 0.76953125f, 0.22265625f, 1.0f)
                         */
                        private fun getFloatArrayFromARGB(argb: String): FloatArray {
                            val colorBase: Int = if (argb.length == 4) {
                                val red = if (argb[1] == '0') 0 else 255
                                val green = if (argb[2] == '0') 0 else 255
                                val blue = if (argb[3] == '0') 0 else 255
                                Color.rgb(red, green, blue)
                            } else {
                                Color.parseColor(argb)
                            }
                            val red = Color.red(colorBase)
                            val green = Color.green(colorBase)
                            val blue = Color.blue(colorBase)
                            val alpha = Color.alpha(colorBase)
                            return floatArrayOf(
                                red / 255f,
                                green / 255f,
                                blue / 255f,
                                alpha / 255f
                            )
                        }
                    

                    用法

                       private val colorValue = getFloatArrayFromARGB("#F0F")
                    

                    希望对大家有所帮助

                    【讨论】:

                      【解决方案15】:

                      试试这个

                      int colorInt = Color.parseColor("#FF00FFF0");
                      bg.setBackgroundColor(colorInt);
                      

                      其中 bg 是您要为其设置背景颜色的视图或布局。

                      【讨论】:

                        猜你喜欢
                        • 2014-04-25
                        • 1970-01-01
                        • 2013-07-29
                        • 2012-11-04
                        • 2013-06-07
                        • 1970-01-01
                        • 2012-11-01
                        • 2020-06-14
                        相关资源
                        最近更新 更多