以编程方式更改按钮颜色

时间:2015-03-19 20:51:52

标签: android button colors

我的应用程序中有不同位置的按钮。我想根据它们的位置给它们上色。(Fragment1中的蓝色按钮,Fragment2中的红色按钮)

我已经尝试过ColorFilter,但这不适用于API< 21.我知道可以为此创建xml,但我不想为我的应用程序中的每个部分创建一个。是否有可能以某种方式创建Backgroud Drawables,它具有我指定的颜色并具有Button动画? (API< 21的纹波和选择器)

1 个答案:

答案 0 :(得分:0)

我找到了解决方案:

**
 * Sets the color of a button.
 * @param button The Button which should be colored.
 * @param color The color as a already retrieved value.
 */
public static void setButtonColor(Button button, int color) {
    if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        //calculate darker color
        float[] hsv = new float[3];
        Color.colorToHSV(color, hsv);
        hsv[2] *= 0.8f;
        int darkColor = Color.HSVToColor(hsv);

        StateListDrawable listDrawable = new StateListDrawable();
        GradientDrawable standard = new GradientDrawable();
        GradientDrawable pressed = new GradientDrawable();

        standard.setColor(color);
        standard.setCornerRadius(3);
        pressed.setColor(darkColor);
        pressed.setCornerRadius(3);

        listDrawable.addState(new int[]{android.R.attr.state_pressed}, pressed);
        listDrawable.addState(new int[]{android.R.attr.state_focused}, pressed);
        listDrawable.addState(StateSet.WILD_CARD, standard);
        if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
            //noinspection deprecation
            button.setBackgroundDrawable(listDrawable);
        } else {
            button.setBackground(listDrawable);
        }
    } else {
        button.getBackground().setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
    }
}

我不知道这是否是最佳选择,但它确实有效。