【问题标题】:How can I convert string to const class int value?如何将字符串转换为 const 类 int 值?
【发布时间】:2012-01-21 11:19:42
【问题描述】:

我有变量:

String colorName = "BLUE";

我想将此颜色设置为 android 应用程序中的油漆。应该是这样的:

paint.setColor ("Color." + colorName);

但我收到错误警告,因为 setColor() 函数的参数应该是 int。 有什么想法吗?谢谢。

【问题讨论】:

    标签: java android swing android-widget


    【解决方案1】:

    也许你想要这个版本。

    paint.setColor(Color.parseColor(字符串颜色)

    http://developer.android.com/reference/android/graphics/Color.html#parseColor%28java.lang.String%29

    【讨论】:

    • 嗨 Kumar Bibek,这正是我要找的。我无法更改已经接受的答案,但我想说非常感谢。太棒了。
    【解决方案2】:

    试试这个:

    protected static final int colorName = Color.BLUE;
    paint.setColor(colorName);
    

    编辑:如我所见,您将 Color 作为字符串。 所以你必须检查它是什么颜色,然后设置你的'colorName'变量。 像这样的:

    if(yourcolorstring.equals("Blue")){
         colorName = Color.BLUE;
    }else if(yourcolorstring.equals("Black")){
         colorName = Color.BLACK;
    }else{
         colorName = Color.WHITE;
    }
    

    【讨论】:

    • 嗨 Prexx ,当我回答 Oskar Kjellin 时,我不知道 const 值。我可以从其他活动接收字符串 "Color.BLUE" 而不是 "BLUE" ,但我能用它做什么?
    【解决方案3】:

    你需要做的:

    paint.setColor(Color.BLUE);
    

    【讨论】:

    • 嗨 Oskar Kjellin,这就是我想要的。但我不知道颜色值,我将它作为字符串变量。我通过其他活动的 extras.getString() 函数收到它。
    • @tatiana_c 那是不可能的。您可能必须使用反射或开关
    • Oskar Kjellin,我想我同意你的看法。我会试试 Prexx 的解决方案。谢谢。
    【解决方案4】:

    如果您有很长的颜色列表并且不想编写很长的if ... else if 语句序列,您也可以为此使用Map。键是带有颜色名称的字符串,值是您要查找的Color 常量值。示例:

    Map<String, Color> colors = new HashMap<String, Color>();
    colors.put("BLUE", Color.BLUE);
    colors.put("RED", Color.RED);
    colors.put("GREEN", Color.GREEN);
    
    // To find the Color constant, look it up in the map:
    String text = "BLUE";
    Color c = colors.get(text);
    if (c != null) {
        paint.setColor(c);
    } else {
        System.out.println("Unknown color: " + text);
    }
    

    【讨论】:

    • 您好 Jesper,谢谢您的回答。我没想到这个方向,我已经收到了 parseColor() 的确切答案,但是在我拥有的其他代码区域中使用它是一个有趣的想法。
    【解决方案5】:

    至少在标准 Java 中可以使用:

    import javax.swing.text.html.CSS;
    
    String colorName = "fuchsia"; // "maroon", "rgb(1,20,30)", "#ff00aa"
    Color color = CSS.stringToColor(colorName);
    

    这是因为 HTML 支持;你也可以用

    写一个JLabel
    "<html><span style='color:blue'>hello</span>"
    

    Oracle 的 JDK 7 显示哪些文本常量是可行的以及哪些格式:

     /**
      * Convert a "#FFFFFF" hex string to a Color.
      * If the color specification is bad, an attempt
      * will be made to fix it up.
      */
    static final Color hexToColor(String value) {
        String digits;
        int n = value.length();
        if (value.startsWith("#")) {
            digits = value.substring(1, Math.min(value.length(), 7));
        } else {
            digits = value;
        }
        String hstr = "0x" + digits;
        Color c;
        try {
            c = Color.decode(hstr);
        } catch (NumberFormatException nfe) {
            c = null;
        }
         return c;
     }
    
    /**
     * Convert a color string such as "RED" or "#NNNNNN" or "rgb(r, g, b)"
     * to a Color.
     */
    static Color stringToColor(String str) {
      Color color;
    
      if (str == null) {
          return null;
      }
      if (str.length() == 0)
        color = Color.black;
      else if (str.startsWith("rgb(")) {
          color = parseRGB(str);
      }
      else if (str.charAt(0) == '#')
        color = hexToColor(str);
      else if (str.equalsIgnoreCase("Black"))
        color = hexToColor("#000000");
      else if(str.equalsIgnoreCase("Silver"))
        color = hexToColor("#C0C0C0");
      else if(str.equalsIgnoreCase("Gray"))
        color = hexToColor("#808080");
      else if(str.equalsIgnoreCase("White"))
        color = hexToColor("#FFFFFF");
      else if(str.equalsIgnoreCase("Maroon"))
        color = hexToColor("#800000");
      else if(str.equalsIgnoreCase("Red"))
        color = hexToColor("#FF0000");
      else if(str.equalsIgnoreCase("Purple"))
        color = hexToColor("#800080");
      else if(str.equalsIgnoreCase("Fuchsia"))
        color = hexToColor("#FF00FF");
      else if(str.equalsIgnoreCase("Green"))
        color = hexToColor("#008000");
      else if(str.equalsIgnoreCase("Lime"))
        color = hexToColor("#00FF00");
      else if(str.equalsIgnoreCase("Olive"))
        color = hexToColor("#808000");
      else if(str.equalsIgnoreCase("Yellow"))
        color = hexToColor("#FFFF00");
      else if(str.equalsIgnoreCase("Navy"))
        color = hexToColor("#000080");
      else if(str.equalsIgnoreCase("Blue"))
        color = hexToColor("#0000FF");
      else if(str.equalsIgnoreCase("Teal"))
        color = hexToColor("#008080");
      else if(str.equalsIgnoreCase("Aqua"))
        color = hexToColor("#00FFFF");
      else if(str.equalsIgnoreCase("Orange"))
        color = hexToColor("#FF8000");
      else
          color = hexToColor(str); // sometimes get specified without leading #
      return color;
    }
    
    /**
     * Parses a String in the format <code>rgb(r, g, b)</code> where
     * each of the Color components is either an integer, or a floating number
     * with a % after indicating a percentage value of 255. Values are
     * constrained to fit with 0-255. The resulting Color is returned.
     */
    private static Color parseRGB(String string) {
        // Find the next numeric char
        int[] index = new int[1];
    
        index[0] = 4;
        int red = getColorComponent(string, index);
        int green = getColorComponent(string, index);
        int blue = getColorComponent(string, index);
    
        return new Color(red, green, blue);
    }
    
    /**
     * Returns the next integer value from <code>string</code> starting
     * at <code>index[0]</code>. The value can either can an integer, or
     * a percentage (floating number ending with %), in which case it is
     * multiplied by 255.
     */
    private static int getColorComponent(String string, int[] index) {
        int length = string.length();
        char aChar;
    
        // Skip non-decimal chars
        while(index[0] < length && (aChar = string.charAt(index[0])) != '-' &&
              !Character.isDigit(aChar) && aChar != '.') {
            index[0]++;
        }
    
        int start = index[0];
    
        if (start < length && string.charAt(index[0]) == '-') {
            index[0]++;
        }
        while(index[0] < length &&
                         Character.isDigit(string.charAt(index[0]))) {
            index[0]++;
        }
        if (index[0] < length && string.charAt(index[0]) == '.') {
            // Decimal value
            index[0]++;
            while(index[0] < length &&
                  Character.isDigit(string.charAt(index[0]))) {
                index[0]++;
            }
        }
        if (start != index[0]) {
            try {
                float value = Float.parseFloat(string.substring
                                               (start, index[0]));
    
                if (index[0] < length && string.charAt(index[0]) == '%') {
                    index[0]++;
                    value = value * 255f / 100f;
                }
                return Math.min(255, Math.max(0, (int)value));
            } catch (NumberFormatException nfe) {
                // Treat as 0
            }
        }
        return 0;
    }
    

    【讨论】:

    • 嗨,Joop Eggen,看起来很有趣,谢谢。我现在尝试了,但收到错误消息“无法解析导入 javax.swing”。我使用 SDK 6。可能是因为我编写了一个 android 应用程序。
    • 很抱歉,我还没有*做一个 Android 应用程序。我将通过CSS的相关代码。
    • Color.parseColor 是更好的答案。
    • 致乔普·埃根。是的,parseColor 更短:-)。但是阅读和理解它对我来说非常有趣。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 2022-06-27
    • 1970-01-01
    相关资源
    最近更新 更多