6

我正在使用这个非常常见的类来圆角:

   public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int pixels) {
        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap
                .getHeight(), Config.ARGB_8888);
        Canvas canvas = new Canvas(output);

        final int color = 0xff424242;
        final Paint paint = new Paint();
        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        final RectF rectF = new RectF(rect);
        final float roundPx = pixels;

        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        canvas.drawBitmap(bitmap, rect, rect, paint);

        return output;
    }

我想修改它,以便只有左上角是圆形的。我在执行此操作的代码中找不到参数?有人可以帮忙吗?

4

6 回答 6

6

这可能不是最有效的方法,但您可以通过在当前蒙版上绘画来填充圆角。您可以从当前代码开始,然后在适当的区域(角落)上使用canvas.drawRect(在调用 之后)。canvas.drawRoundRect我想这样的事情只会围绕左上角:

public static Bitmap getRoundedTopLeftCornerBitmap(Bitmap bitmap, int pixels) {
    Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap
            .getHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(output);

    final int color = 0xff424242;
    final Paint paint = new Paint();
    final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
    final RectF rectF = new RectF(rect);
    final float roundPx = pixels;
    final Rect topRightRect = new Rect(bitmap.getWidth()/2, 0, bitmap.getWidth(), bitmap.getHeight()/2);
    final Rect bottomRect = new Rect(0, bitmap.getHeight()/2, bitmap.getWidth(), bitmap.getHeight());

    paint.setAntiAlias(true);
    canvas.drawARGB(0, 0, 0, 0);
    paint.setColor(color);
    canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
    // Fill in upper right corner
    canvas.drawRect(topRightRect, paint);
    // Fill in bottom corners
    canvas.drawRect(bottomRect, paint);

    paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
    canvas.drawBitmap(bitmap, rect, rect, paint);

    return output;
}

如果您愿意,可以在这里进行一些优化,但我认为它应该可以工作。一般的想法肯定应该。虽然我没有尝试或测试过这段代码,但它看起来不正确 ifpixels > bitmap.getWidth()/2pixels > bitmap.getHeight()/2. 话又说回来,以前可能也是如此。

于 2013-06-21T01:17:57.263 回答
4
public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int topLeftX, int topLeftY, int topRightX, int topRightY, int bottomRightX, int bottomRightY, int bottomLeftX, int bottomLeftY) {
        final Paint paint = new Paint();
        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(output);
        // the float array passed to this function defines the x/y values of the corners
        // it starts top-left and works clockwise
        // so top-left-x, top-left-y, top-right-x etc
        RoundRectShape rrs = new RoundRectShape(new float[]{topLeftX, topLeftY, topRightX, topRightY, bottomRightX, bottomRightY, bottomLeftX, bottomLeftY}, null, null);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setAntiAlias(true);
        paint.setColor(0xFF000000);
        rrs.resize(bitmap.getWidth(), bitmap.getHeight());
        rrs.draw(canvas, paint);
        paint.setXfermode(new PorterDuffXfermode(android.graphics.PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(bitmap, rect, rect, paint);
        return output;
    }

或者您可以查看 RoundRects.java 源代码 - 展示如何生成圆角的示例,可在 SDK 示例中找到:http: //grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/ android-apps/4.3_r2.1/com/example/android/apis/graphics/RoundRects.java/

于 2013-12-09T09:07:06.927 回答
3

这是用于选择角落:

public static Bitmap getRoundedCornerBitmap(Context context, Bitmap bitmap, float roundDip, boolean roundTL, boolean roundTR, boolean roundBL, boolean roundBR)
{
    try
    {

        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
        Canvas canvas = new Canvas(output);

        final int color = 0xff424242;
        final Paint paint = new Paint();
        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        final RectF rectF = new RectF(rect);
        final float roundPx = convertDipToPixel(roundDip, context);

        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);// draw round
                                                                // 4Corner

        if (!roundTL)
        {
            Rect rectTL = new Rect(0, 0, bitmap.getWidth() / 2, bitmap.getHeight() / 2);
            canvas.drawRect(rectTL, paint);
        }
        if (!roundTR)
        {
            Rect rectTR = new Rect(bitmap.getWidth() / 2, 0, bitmap.getWidth(), bitmap.getHeight() / 2);
            canvas.drawRect(rectTR, paint);
        }
        if (!roundBR)
        {
            Rect rectBR = new Rect(bitmap.getWidth() / 2, bitmap.getHeight() / 2, bitmap.getWidth(), bitmap.getHeight());
            canvas.drawRect(rectBR, paint);
        }
        if (!roundBL)
        {
            Rect rectBL = new Rect(0, bitmap.getHeight() / 2, bitmap.getWidth() / 2, bitmap.getHeight());
            canvas.drawRect(rectBL, paint);
        }

        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        canvas.drawBitmap(bitmap, rect, rect, paint);

        return output;
    } catch (Exception e)
    {
    }
    return bitmap;
}
于 2014-04-29T13:57:57.097 回答
1

这更像是一个概念性的答案,但是您是否可以绘制一个圆角矩形,然后在您希望圆角的角上放置两个普通矩形?

视觉示例

于 2013-06-21T01:35:45.347 回答
0

如果您需要(在画布上)为不同的角绘制具有不同半径的圆形矩形,您可以使用以下命令:

private void drawAsymmetricRoundRect(Canvas canvas, RectF rectF, float[] radii, Paint paint) {
    float topLeftX = rectF.left + radii[0];
    float topLeftY = rectF.top + radii[0];
    float topRightX = rectF.right - radii[1];
    float topRightY = rectF.top + radii[1];
    float bottomRightX = rectF.right - radii[2];
    float bottomRightY = rectF.bottom - radii[2];
    float bottomLeftY = rectF.bottom - radii[3];
    float bottomLeftX = rectF.left + radii[3];
    RectF topLeftCorner = new RectF(rectF.left, rectF.top, topLeftX + radii[0], topLeftY + radii[0]);
    RectF topRightCorner = new RectF(topRightX - radii[1], rectF.top, rectF.right, topRightY + radii[1]);
    RectF bottomRightCorner = new RectF(bottomRightX - radii[2], bottomRightY - radii[2], rectF.right, rectF.bottom);
    RectF bottomLeftCorner = new RectF(rectF.left, bottomLeftY - radii[3], bottomLeftX + radii[3], rectF.bottom);

    canvas.drawArc(topLeftCorner, 180, 90, true, paint);
    canvas.drawArc(topRightCorner, 270, 90, true, paint);
    canvas.drawArc(bottomRightCorner, 0, 90, true, paint);
    canvas.drawArc(bottomLeftCorner, 90, 90, true, paint);
    canvas.drawRect(topLeftX, rectF.top, topRightX, bottomLeftY < bottomRightY ? bottomLeftY : bottomRightY, paint); //top rect
    canvas.drawRect(topLeftX > bottomLeftX ? topLeftX : bottomLeftX, topRightY, rectF.right, bottomRightY, paint); //right rect
    canvas.drawRect(bottomLeftX, topLeftY > topRightY ? topLeftY : topRightY, bottomRightX, rectF.bottom, paint); //bottom rect
    canvas.drawRect(rectF.left, topLeftY, bottomRightX < topRightX ? bottomRightX : topRightX, bottomLeftY, paint); //left rect
}

float[] radii是一个浮点数组(长度 = 4),它存储角的半径大小(顺时针,从左上角 => 开始{topLeft, topRight, bottomRight, bottomLeft})。

基本上,这种方法绘制 4 个弧(角)并用 4 个矩形填充这些角之间的所有内容。

重要说明:我将角点的初始化放在RectFs此方法中,以降低发布代码的复杂性。由于您可能会从您的方法中调用此方法onDraw(),因此您应该提取这部分代码,并将其放置在您初始化其他的地方Rects(只要您不初始化它们onDraw():P)。

于 2015-06-24T08:43:29.193 回答
0
Path clipPath = new Path();
RectF rect = new RectF(0, 0, this.getWidth(), this.getHeight());
clipPath.addRoundRect(rect, new float[]{radius, radius, 0, 0, 0, 0, 0, 0}, 
Path.Direction.CW);
canvas.clipPath(clipPath);

此代码生成带有圆形左上角的图像 - 每对浮点参数描述每个角的角度

关键功能是:

public void addRoundRect(RectF rect, float[] radii, Direction dir)

在路径类

来自文档的描述:

向路径添加一个闭合的圆角矩形轮廓。每个角接收两个半径值 [X, Y]。角的顺序是左上角、右上角、右下角、左下角

@param rect 要添加到路径的圆角矩形的边界

@param radii 8 个值的数组,4 对 [X,Y] 半径

@param dir 绕圆矩形轮廓的方向

于 2018-06-11T05:49:34.313 回答