java - 以编程方式向按钮添加描边

标签 java android android-layout android-button

有什么方法可以使用 java 而不是 XML 向按钮添加笔划/轮廓?我一直在努力研究它,我遇到的一切都是 XML。

我想要做的是让按钮默认带有黑色边框。然后在按下后颜色会变成红色。

最佳答案

在Java中你可以这样实现,

    public Drawable getMyDrawable() {
        StateListDrawable states = new StateListDrawable();

//        states.addState(new int[]{
//                -android.R.attr.state_enabled,
//        }, getDisableDrawable());

        states.addState(new int[]{
                android.R.attr.state_focused, -android.R.attr.state_pressed,
        }, getDrawable(true));
        states.addState(new int[]{
                android.R.attr.state_focused, android.R.attr.state_pressed,
        }, getDrawable(true));
        states.addState(new int[]{
                -android.R.attr.state_focused, android.R.attr.state_pressed,
        }, getDrawable(true));
        states.addState(new int[]{
                android.R.attr.state_enabled
        }, getDrawable(false));

        return states;
    }

    public Drawable getDrawable(boolean pressed) {
        Drawable[] normalDrawable = new Drawable[2];
        normalDrawable[0] = getRectBorder(pressed);
        normalDrawable[1] = getRectBG();

        LayerDrawable layerDrawable = new LayerDrawable(normalDrawable);
        layerDrawable.setLayerInset(1, 2, 2, 2, 2);

        return layerDrawable.mutate();
    }

    public Drawable getRectBorder(boolean pressed) {
        RectShape rectShape = new RectShape();
        ShapeDrawable shapeDrawable = new ShapeDrawable(rectShape);
        shapeDrawable.getPaint().setColor(pressed ? Color.RED : Color.BLACK);
        shapeDrawable.getPaint().setStyle(Paint.Style.STROKE);
        shapeDrawable.getPaint().setStrokeWidth(2);
        shapeDrawable.getPaint().setAntiAlias(true);
        shapeDrawable.getPaint().setFlags(Paint.ANTI_ALIAS_FLAG);
        return shapeDrawable.mutate();
    }

    public Drawable getRectBG() {
        RectShape rectShape = new RectShape();
        ShapeDrawable shapeDrawable = new ShapeDrawable(rectShape);
        shapeDrawable.getPaint().setColor(Color.WHITE);
        shapeDrawable.getPaint().setStyle(Paint.Style.FILL);
        shapeDrawable.getPaint().setAntiAlias(true);
        shapeDrawable.getPaint().setFlags(Paint.ANTI_ALIAS_FLAG);
        return shapeDrawable.mutate();
    }

最后在你的按钮中你可以这样设置,

Button button = (Button) findViewById(R.id.button);

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
    button.setBackgroundDrawable(getMyDrawable());
} else {
    button.setBackground(getMyDrawable());
}

关于java - 以编程方式向按钮添加描边,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45180032/

相关文章:

java - 如何在digitalocean中设置java环境?

java - 如何在不指定绝对路径的情况下从另一个 java 包中读取文件(例如 txt 文件)?

Android导入库报错DefaultGroovyMavenDeveloper

android - Parse 服务器退役后,Parse4cn1 还能工作吗?

android - 以编程方式更改图层列表中形状的颜色

java - 基于解析的 XML 更改页面 - Android

java - 如何在 hibernate 中获取排序结果中的第一组结果?

android - 如何使用sqlite在Android游戏中存储100多个问题数据

android - 使用滚动按钮时应用程序崩溃

java - 以编程方式将 TextView 放置在相对布局中的彼此下方