Android dynamically generates button styles

Dynamically generate button styles

use:

    int borderColor = Color.parseColor("#2E3135");
    int bgColor = Color.parseColor("#00FF00");

    // 设置View背景样式,有边框宽度、边框颜色、圆角度数、背景颜色。
    GradientDrawable shape = DrawableUtils.createShape(1, 4, borderColor, bgColor);
    btn1.setBackground(shape);

    int textNormalColor = Color.parseColor("#2E3135");
    int textPressColor = Color.parseColor("#FF0000");
    int textFocusColor = Color.parseColor("#00FF00");
    int textEnableColor = Color.parseColor("#0000FF");

    // 设置文本点击样式切换
    ColorStateList colorStateList = DrawableUtils.createColorStateList(textNormalColor, textPressColor, textFocusColor, textEnableColor);
    btn2.setTextColor(colorStateList);
    /* android:focusableInTouchMode="true" 控件默认获取焦点 */

    int color1 = Color.parseColor("#FF0000");
    int color2 = Color.parseColor("#00FF00");

    // 设置View点击样式切换
    GradientDrawable unSelected = DrawableUtils.createShape(1, 4, color1, color2);
    GradientDrawable selected = DrawableUtils.createShape(1, 4, color2, color1);
    StateListDrawable stateListDrawable = DrawableUtils.createStateListDrawable(unSelected, selected);
    btn3.setBackground(stateListDrawable);

Tools:

public class DrawableUtils {

    /**
     * 创建一个shape
     *
     * @param strokeWidth 边框宽度(px)
     * @param roundRadius 圆角半径(px)
     * @param strokeColor 边框颜色
     * @param fillColor   内部填充颜色
     * @return GradientDrawable
     */
    public static GradientDrawable createShape(int strokeWidth, int roundRadius, int strokeColor, int fillColor) {
        GradientDrawable gd = new GradientDrawable();
        gd.setColor(fillColor);
        gd.setCornerRadius(roundRadius);
        gd.setStroke(strokeWidth, strokeColor);
        return gd;
    }

    /**
     * 创建按钮文字点击样式
     *
     * @param normal  正常样式
     * @param pressed 按下样式
     * @param focused 焦点样式
     * @param unable  不可用样式
     * @return ColorStateList
     */
    public static ColorStateList createColorStateList(int normal, int pressed, int focused, int unable) {
        int[] colors = new int[]{pressed, focused, normal, focused, unable, normal};
        int[][] states = new int[6][];
        states[0] = new int[]{android.R.attr.state_pressed, android.R.attr.state_enabled};
        states[1] = new int[]{android.R.attr.state_enabled, android.R.attr.state_focused};
        states[2] = new int[]{android.R.attr.state_enabled};
        states[3] = new int[]{android.R.attr.state_focused};
        states[4] = new int[]{android.R.attr.state_window_focused};
        states[5] = new int[]{};
        return new ColorStateList(states, colors);
    }

    /**
     * 创建按钮点击样式
     *
     * @param unSelected 未点击样式
     * @param selected 点击样式
     * @return StateListDrawable
     */
    public static StateListDrawable createStateListDrawable(GradientDrawable unSelected, GradientDrawable selected) {
        StateListDrawable drawable = new StateListDrawable();
        drawable.addState(new int[]{android.R.attr.state_pressed}, selected);
        drawable.addState(new int[]{-android.R.attr.state_pressed}, unSelected);
        return drawable;
    }

}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324481220&siteId=291194637