нарисовать закругленный угол внутри прямоугольника - PullRequest
0 голосов
/ 11 мая 2018

Я разработал один вид, в котором у меня закругленные углы. и внутри этого взгляда у меня другой взгляд. Я даю закругленные углы инсульта, но это не влияет на коробку. Вы можете посмотреть на скриншоте ниже.

enter image description here

вы можете видеть в обоих внутренних углах. Есть не правильно закругленные формы.

так как я могу сделать это с правильной округлой формой?

ниже код:

Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(mBorderColor);
paint.setStyle(Style.STROKE);
float strokeWidth = mHeight / 30.0f;
float strokeWidth2 = strokeWidth / 2;
paint.setStrokeWidth(strokeWidth);
int space = 3;
int headHeight = (int) (strokeWidth + 10.5f);


Path strokepath = RoundedRect(strokeWidth2, headHeight + strokeWidth2, mWidth - strokeWidth2, mHeight - strokeWidth2, 15, 15,
                    true, true, true, true);
canvas.drawPath(strokepath, paint);


Path fillpath = RoundedRect(strokeWidth+space, headHeight + strokeWidth + topOffset-space, mWidth - strokeWidth-space, mHeight - strokeWidth-space, 15, 15,
                    true, true, true, true);
canvas.drawPath(fillpath, mViewPaint);

paint.setStyle(Style.FILL);


public static Path RoundedRect(
            float left, float top, float right, float bottom, float rx, float ry,
            boolean tl, boolean tr, boolean br, boolean bl) {

    Path path = new Path();
    if (rx < 0) rx = 0;
    if (ry < 0) ry = 0;
    float width = right - left;
    float height = bottom - top;
    if (rx > width / 2) rx = width / 2;
    if (ry > height / 2) ry = height / 2;
    float widthMinusCorners = (width - (2 * rx));
    float heightMinusCorners = (height - (2 * ry));

    path.moveTo(right, top + ry);
    if (tr)
        path.rQuadTo(0, -ry, -rx, -ry);//top-right corner
    else {
        path.rLineTo(0, -ry);
        path.rLineTo(-rx, 0);
    }
    path.rLineTo(-widthMinusCorners, 0);
    if (tl)
        path.rQuadTo(-rx, 0, -rx, ry); //top-left corner
    else {
        path.rLineTo(-rx, 0);
        path.rLineTo(0, ry);
    }
    path.rLineTo(0, heightMinusCorners);

    if (bl)
        path.rQuadTo(0, ry, rx, ry);//bottom-left corner
    else {
        path.rLineTo(0, ry);
        path.rLineTo(rx, 0);
    }

    path.rLineTo(widthMinusCorners, 0);
    if (br)
        path.rQuadTo(rx, 0, rx, -ry); //bottom-right corner
    else {
        path.rLineTo(rx, 0);
        path.rLineTo(0, -ry);
    }

    path.rLineTo(0, -heightMinusCorners);

    path.close();//Given close, last lineto can be removed.

    return path;
}

1 Ответ

0 голосов
/ 11 мая 2018

При способе, которым рисуются углы, внутренняя часть угла всегда будет иметь меньшие радиусы, чем внешняя часть угла. Чтобы получить правильные радиусы для внутренней части, вы должны нарисовать его на экране. В этом случае вы должны нарисовать пространство между Stoke Path и Fill Path. Приведенный ниже код необходим для рисования пространства, если mViewPaint не имеет ширины штриха.

Paint spacePaint = new Paint();
    spacePaint.setAntiAlias(true);
    spacePaint.setColor(mBackground);
    spacePaint.setStyle(Paint.Style.STROKE);
    spacePaint.setStrokeWidth(space*2);

Path spacepath = RoundedRect(strokeWidth + space, 
            headHeight + strokeWidth + topOffset-space, 
            mWidth - strokeWidth - space, 
            mHeight - strokeWidth - space, 
            15, 15,
            true, true, true, true);
canvas.drawPath(spacepath, spacePaint);

Вы также должны изменить следующую строку, чтобы это работало

paint.setStyle(Paint.Style.STROKE);

до

paint.setStyle(Paint.Style.FILL_AND_STROKE);

Теперь, как и другие предполагали, вы могли бы использовать либо Canvas.drawRoundRect(), либо Path.addRoundRect, и они сделали бы то же самое, что и ваш метод RoundedRect.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...