【问题标题】:How to draw a partial round rect on a android canvas?如何在 android 画布上绘制部分圆形矩形?
【发布时间】:2016-11-11 14:22:50
【问题描述】:

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

【问题讨论】:

    标签: android path android-canvas draw android-drawable


    【解决方案1】:

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

    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 值来包含选定的部分将是一个好主意

      私有静态最终 int TOP_LEFT_CORNER = 0x1; 私有静态最终 int TOP_LINE = 0x2; 私有静态最终 int TOP_RIGHT_CORNER = 0x4; 私有静态最终 int RIGHT_LINE = 0x8; 私有静态最终 int BOTTOM_RIGHT_CORNER = 0x10; 私有静态最终 int BOTTOM_LINE = 0x20; 私有静态最终 int BOTTOM_LEFT_CORNER = 0x40; 私有静态最终int LEFT_LINE = 0x80; 私有int selectedParts = TOP_LEFT_CORNER | TOP_LINE | TOP_RIGHT_CORNER;

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

      paint.setStyle(Paint.Style.STROKE); 如果((选定的部分和 TOP_LINE)> 0){ canvas.drawLine(drawingRect.left + topLeftRadius,drawingRect.top,drawingRect.right - topRightRadius,drawingRect.top); } 如果((选定的部分和顶部右角)> 0){ canvas.drawArc(topRightArcBound, -90, 90, false, paint); } 如果((选定的部分和 RIGHT_LINE)> 0){ canvas.drawLine(drawingRect.right,drawingRect.top + topRightRadius,drawingRect.right,drawingRect.bottom - bottomRightRadius,paint); } 如果((选定零件和底部右角)> 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); } 如果((选定的部分和底部_左角)> 0){ canvas.drawArc(bottomLeftArcBound, 90, 90, false, paint); } 如果(((选定的部分和 LEFT_LINE)> 0){ canvas.drawLine(drawingRect.left,drawingRect.bottom - bottomLeftRadius,drawingRect.left,drawingRect.top + topLeftRadius,paint); } 如果((选定的部分和 TOP_LEFT_CORNER)> 0){ canvas.drawArc(topLeftArcBound, 180, 90, false, paint); }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 2015-01-08
      • 1970-01-01
      • 2015-03-16
      相关资源
      最近更新 更多