可通过代码绘制的圆角

Posted

技术标签:

【中文标题】可通过代码绘制的圆角【英文标题】:Rounded corners drawable via code 【发布时间】:2012-09-29 16:47:48 【问题描述】:

我有一个有时会改变颜色的drawable,但它必须总是有圆角。这是一个 UI 库,所以我不知道它会有什么颜色。 XML 不是一个选项,我必须用纯 java 来实现。

有没有办法在不使用 XML 的情况下以编程方式实现这一目标?

【问题讨论】:

【参考方案1】:

创建一个自定义 Drawable(即扩展 Drawable)并在其 onDraw 中使用 Canvas.drawRoundRect(RectF rect, float rx, float ry, Paint paint),将 Paint 设置为所需的颜色。

【讨论】:

是的,但我需要知道尺寸。我希望获得与使用 XML 相同的结果。 Drawable 通过 setBounds 获取其尺寸,如果 Drawable 设置为 View 的背景,则会自动调用。【参考方案2】:

如果您自己绘制drawable,您可以使用Canvas.clipPath 设置剪辑路径。路径将由一个或多个矩形和一些圆形组成,它们会夹住圆角。您可能需要调整路径组件的排列,直到获得所需的输出。

【讨论】:

【参考方案3】:

根据@nmw 的回答,这里有一些适用于此的代码:

public class RRDrawable extends Drawable 
    private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

    public RRDrawable(int color) 
        paint.setColor(color);
        paint.setStyle(Paint.Style.FILL);
    

    @Override
    public void draw(Canvas canvas) 
        int radius = 10; // note this is actual pixels
        canvas.drawRoundRect(new RectF(0,0,canvas.getWidth(), canvas.getHeight()), radius, radius,  paint);
    

    @Override
    public void setAlpha(int i) 
        //.. not supported
    

    @Override
    public void setColorFilter(ColorFilter colorFilter) 
        //.. not supported
    

    @Override
    public int getOpacity() 
        return 1;
    

编辑:向边缘添加抗锯齿。

(source)

【讨论】:

以上是关于可通过代码绘制的圆角的主要内容,如果未能解决你的问题,请参考以下文章

数据可视化应用绘制圆角条形图(附R语言代码)

如何快速绘制简单的圆角矩形(圆角)

可可绘制带圆角和阴影的图像

绘制圆角矩形的透明度问题

绘制没有底部边框的圆角矩形边框

绘制圆角相交线