gpt4 book ai didi

android - 如何在android Canvas 上绘制部分圆形矩形?

转载 作者:行者123 更新时间:2023-11-29 15:42:29 26 4
gpt4 key购买 nike

我想在 Canvas 上绘制一个圆角矩形,用颜色(或位图)和笔触填充,但没有选定的角,也没有某些选定边的边界。有什么想法可以实现吗?

最佳答案

您可以将绘图过程分成两部分。

  1. 绘制填充区域

    当尝试绘制标准 sdk API 不支持的形状时,Canvas.drawPath 方法将是一个很好的方法。您可以只定义四个变量来表示四个角的半径。

    Path path = new Path();
    Rect drawingRect = {the rect area you want to draw}
    RectF topLeftArcBound = new RectF();
    RectF topRightArcBound = new RectF();
    RectF bottomLeftArcBound = new RectF();
    RectF bottomRightArcBound = new RectF();

    topRightArcBound.set(drawingRect.right - topRightRadius * 2, drawingRect.top, drawingRect.right, drawingRect.top + topRightRadius * 2);
    bottomRightArcBound.set(drawingRect.right - bottomRightRadius * 2, drawingRect.bottom - bottomRightRadius * 2, drawingRect.right, drawingRect.bottom);
    bottomLeftArcBound.set(drawingRect.left, drawingRect.bottom - bottomLeftRadius * 2, drawingRect.left + bottomLeftRadius * 2, drawingRect.bottom);
    topLeftArcBound.set(drawingRect.left, drawingRect.top, drawingRect.left + topLeftRadius * 2, drawingRect.top + topLeftRadius * 2);

    path.reset();

    path.moveTo(drawingRect.left + topLeftRadius, drawingRect.top);

    //draw top horizontal line
    path.lineTo(drawingRect.right - topRightRadius, drawingRect.top);

    //draw top-right corner
    path.arcTo(topRightArcBound, -90, 90);

    //draw right vertical line
    path.lineTo(drawingRect.right, drawingRect.bottom - bottomRightRadius);

    //draw bottom-right corner
    path.arcTo(bottomRightArcBound, 0, 90);

    //draw bottom horizontal line
    path.lineTo(drawingRect.left - bottomLeftRadius, drawingRect.bottom);

    //draw bottom-left corner
    path.arcTo(bottomLeftArcBound, 90, 90);

    //draw left vertical line
    path.lineTo(drawingRect.left, drawingRect.top + topLeftRadius);

    //draw top-left corner
    path.arcTo(topLeftArcBound, 180, 90);

    path.close();

    paint.setStyle(Paint.Style.FILL);
    canvas.drawPath(path, paint);

    您可以将选定角的半径设置为零

  2. 绘制边框

    边框包含八个部分:

    • 左上角
    • 顶线
    • 右上角
    • 右线
    • 右下角
    • 底线
    • 左下角
    • 左行

    使用 int 值来包含选定的部分将是一个好主意

    private static final int TOP_LEFT_CORNER = 0x1;private static final int TOP_LINE = 0x2;private static final int TOP_RIGHT_CORNER = 0x4;private static final int RIGHT_LINE = 0x8;private static final int BOTTOM_RIGHT_CORNER = 0x10;private static final int BOTTOM_LINE = 0x20;private static final int BOTTOM_LEFT_CORNER = 0x40;private static final int LEFT_LINE = 0x80;private int selectedParts = TOP_LEFT_CORNER | TOP_LINE | TOP_RIGHT_CORNER;

    现在我们可以根据selectedParts绘制边框了:

    paint.setStyle(Paint.Style.STROKE);if((selectedParts & TOP_LINE) > 0){    canvas.drawLine(drawingRect.left + topLeftRadius, drawingRect.top, drawingRect.right - topRightRadius, drawingRect.top);}if((selectedParts & TOP_RIGHT_CORNER) > 0){    canvas.drawArc(topRightArcBound, -90, 90, false, paint);}if((selectedParts & RIGHT_LINE) > 0){    canvas.drawLine(drawingRect.right, drawingRect.top + topRightRadius, drawingRect.right, drawingRect.bottom - bottomRightRadius, paint);}if((selectedParts & BOTTOM_RIGHT_CORNER) > 0){    canvas.drawArc(bottomRightArcBound, 0, 90, false, paint);}if((selectedParts & BOTTOM_LINE) > 0){    canvas.drawLine(drawingRect.right - bottomRightRadius, drawingRect.bottom. drawingRect.left + bottomLeftRadius, drawingRect.bottom, paint);}if((selectedParts & BOTTOM_LEFT_CORNER) > 0){    canvas.drawArc(bottomLeftArcBound, 90, 90, false, paint);}if((selectedParts & LEFT_LINE) > 0){    canvas.drawLine(drawingRect.left, drawingRect.bottom - bottomLeftRadius, drawingRect.left, drawingRect.top + topLeftRadius, paint);}if((selectedParts & TOP_LEFT_CORNER) > 0){    canvas.drawArc(topLeftArcBound, 180, 90, false, paint);}

关于android - 如何在android Canvas 上绘制部分圆形矩形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38276424/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com