在Android中绘制一个带边框的填充矩形

63

在Android中,有没有一种方法可以绘制一个带黑边框的填充矩形?我的问题是canvas.draw()只接受一个paint对象,并且据我所知,该paint对象无法为填充和描边设置不同的颜色。是否有解决方法?


1
你是对的。先画填充矩形,然后再画外边缘的描边。 - Gene
3个回答

158

尝试使用paint.setStyle(Paint.Style.FILL)和paint.setStyle(Paint.Style.STROKE)。

Paint paint = new Paint();
Rect r = new Rect(10, 10, 200, 100);

@Override
public void onDraw(Canvas canvas) {
    // fill
    paint.setStyle(Paint.Style.FILL);
    paint.setColor(Color.MAGENTA); 
    canvas.drawRect(r, paint);

    // border
    paint.setStyle(Paint.Style.STROKE);
    paint.setColor(Color.BLACK);
    canvas.drawRect(r, paint);
}

是否也有方法可以为canvas.drawRoundRect()完成此操作?因为在我的情况下,边框现在具有圆角,即使我也使用canvas.drawRoundRect()进行绘制。 - Chris
6
我知道这个回答很旧,但我想分享一下这行代码:paint.setPathEffect(new CornerPathEffect(radius)); 以回答Chris的问题。我只是回答了因为可能有人需要帮助。 - Crash
@Crash 最好使用drawRoundRect来实现动态半径(基于矩形大小)。 - user924

50

如果你要绘制多个视图,可以使用两种不同的画笔来分别进行描边和填充。这样就不必不断重置画笔了。

在此输入图片描述

Paint fillPaint = new Paint();
Paint strokePaint = new Paint();

RectF r = new RectF(30, 30, 1000, 500);

void initPaints() {

    // fill
    fillPaint.setStyle(Paint.Style.FILL);
    fillPaint.setColor(Color.YELLOW);

    // stroke
    strokePaint.setStyle(Paint.Style.STROKE);
    strokePaint.setColor(Color.BLACK);
    strokePaint.setStrokeWidth(10);
}

@Override
protected void onDraw(Canvas canvas) {

    // First rectangle
    canvas.drawRect(r, fillPaint);    // fill
    canvas.drawRect(r, strokePaint);  // stroke

    canvas.translate(0, 600);

    // Second rectangle
    int cornerRadius = 50;
    canvas.drawRoundRect(r, cornerRadius, cornerRadius, fillPaint);    // fill
    canvas.drawRoundRect(r, cornerRadius, cornerRadius, strokePaint);  // stroke
}

1

你用边框的颜色和矩形加上边框的大小画一个矩形,然后改变油漆的颜色,再用正常大小重新画一个矩形。


17
请注意,这将导致绘制几乎两倍面积相同的图形。 - Radu Simionescu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接