详述Canvas(五)/绘制圆角矩形

Canvas并没有提供绘制圆角矩形的方法,但是通过观察,我们可以发现,其实我们可以将圆角矩形分为四段,可以通过使用arcTo来实现。

我们假设起点为x,y.绘制的矩形宽高为w,h.圆角的半径为r;所以将起点设置在(x+r,y)处,然后acrTo(x+w,y,x+w,y+h,r),对于终点,其实只要y值大于绿色点的都是可以的(这部分在绘制曲线部分已经详述)。此处我们将终点设为(x+w,y+h);这就是第一段曲线。第一段曲线绘制完毕之后,画笔落在了下图绿色点的位置。

现在再看下第二段曲线:

因此我们直接使用arcTo(x+w,y+h,x,y+h,r)绘制出第二个圆角,第二个曲线绘制完毕后,画笔落在了绿色点位置。

我们可以使用同样的方法来绘制第三个圆角。

acrTo(x,y+h,x,y,r)

第四个圆角arcTo(x,y,x+w,y):

这样,一个圆角矩形就完成了。为了方便使用,我们可以将绘制圆角矩形的方法封装在一个函数,或者加入到CanvasRenderingContext2D的原型中。

x,y是矩形的起点;w,h是矩形的宽高;r是圆角矩形的半径.

CanvasRenderingContext2D.prototype.roundRect = function (x, y, w, h, r) {
    if (w < 2 * r) {r = w / 2;}
    if (h < 2 * r){ r = h / 2;}
    this.beginPath();
    this.moveTo(x+r, y);
    this.arcTo(x+w, y, x+w, y+h, r);
    this.arcTo(x+w, y+h, x, y+h, r);
    this.arcTo(x, y+h, x, y, r);
    this.arcTo(x, y, x+w, y, r);
    this.closePath();
    return this;
}

这里使用了return this,这样我们就可以像使用jquery一样,使用链式语法。

完整代码如下:

<body>
    <canvas id = "palette" width="400px" height="400px">
        您的浏览器不支持Canvas标签,请升级或更换浏览器
    </canvas>
</body>
</html>
<script>
    var palette = document.querySelector("#palette").getContext("2d");
    palette.moveTo(0,0);
    palette.lineTo(0,300);
    palette.moveTo(50.5,0);
    palette.lineTo(50.5,300);
    palette.moveTo(100.5,0);
    palette.lineTo(100.5,300);
    palette.moveTo(150.5,0);
    palette.lineTo(150.5,300);
    palette.moveTo(200.5,0);
    palette.lineTo(200.5,300);
    palette.moveTo(250.5,0);
    palette.lineTo(250.5,300);
    palette.moveTo(300.5,0);
    palette.lineTo(300.5,300);
    palette.moveTo(0,0);
    palette.lineTo(300,0);
    palette.moveTo(0,50.5);
    palette.lineTo(300,50.5);
    palette.moveTo(0,100.5);
    palette.lineTo(300,100.5);
    palette.moveTo(0,150.5);
    palette.lineTo(300,150.5);
    palette.moveTo(0,200.5);
    palette.lineTo(300,200.5);
    palette.moveTo(0,250.5);
    palette.lineTo(300,250.5);
    palette.moveTo(0,300.5);
    palette.lineTo(300,300.5);
    palette.stroke();

    CanvasRenderingContext2D.prototype.roundRect = function (x, y, w, h, r) {
        if (w < 2 * r) r = w / 2;
        if (h < 2 * r) r = h / 2;
        this.beginPath();
        this.moveTo(x+r, y);
        this.arcTo(x+w, y, x+w, y+h, r);
        this.arcTo(x+w, y+h, x, y+h, r);
        this.arcTo(x, y+h, x, y, r);
        this.arcTo(x, y, x+w, y, r);
        this.closePath();
        return this;
    }
    palette.lineWidth = 5;
    palette.strokeStyle = "#F00";
    palette.roundRect(50,50,200,150,30).stroke();
</script>

时间: 2024-11-07 14:51:45

详述Canvas(五)/绘制圆角矩形的相关文章

canvas.drawRoundRect方法,绘制圆角矩形

public void drawRoundRect (RectF rect, float rx, float ry, Paint paint) Draw the specified round-rect using the specified paint. The roundrect will be filled or framed based on the Style in the paint. Parameters rect The rectangular bounds of the rou

drawRoundRect方法:绘制圆角矩形

[功能说明]该方法用于在画布上绘制圆角矩形,通过指定RectF对象以及圆角半径来实现.该方法是绘制圆角矩形的主要方法,同时也可以通过设置画笔的空心效果来绘制空心的圆角矩形. [基本语法]public void drawRoundRect (RectF rect, float rx, float ry, Paint paint) 参数说明 rect:RectF对象. rx:x方向上的圆角半径. ry:y方向上的圆角半径. paint:绘制时所使用的画笔. [实例演示]下面通过代码来演示如何在画布上

canva绘制圆角矩形

在做组态的时候,需要支持矩形圆角格式,但是因为canvas本身不带有圆角矩形,需要自行算出坐标进行绘制 方案一.统一圆角 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canvas制作圆角矩形(包括填充矩形的功能)</title> </head> <body> <canvas id="myCanvas&

【VB6 GDI+进阶】通过拼接圆弧和线绘制圆角矩形

GDI+中没有直接绘制圆角矩形的函数.本篇将详细介绍如何通过拼接圆弧和线绘制圆角矩形,结尾附封装好的函数,可以直接调用. 1.GdipDrawArcI(绘制圆弧) 函数声明如下: Public Declare Function GdipDrawArcI _ Lib "gdiplus" (ByVal graphics As Long, _ ByVal Pen As Long, _ ByVal X As Long, _ ByVal Y As Long, _ ByVal Width As L

章鱼哥出品—VB.NET 如何绘制圆角矩形,并适应窗体大小

Public Class Form1 '********************************************************************* '作者:章鱼哥,QQ:3107073263 群:309816713 '如有疑问或好的建议请联系我,大家一起进步 '********************************************************************* '绘制圆角矩形函数 Private Function GetRou

Android中绘制圆角矩形图片及任意形状图片

圆角矩形图片在苹果的产品中很流行,相比于普通的矩形,很多人都喜欢圆角矩形的图片,因为它避开了直角的生硬,带来更好的用户体验,下面是几个设计的例子: 下面在Android中实现将普通的矩形图片绘制成圆角矩形.首先看最终效果: 代码清单: package com.example.phototest; import android.os.Bundle; import android.app.Activity; import android.graphics.Bitmap; import android

详述canvas(三)—绘制图形/填充和渐变

未闭合的图形也会被填充 <body> <canvas id = "palette" width="500px" height="500px"> 您的浏览器不支持canvas标签,请升级浏览器或更换其它浏览器 </canvas> </body> </html> <script> var palette = document.querySelector("#palett

CSS3绘制圆角矩形的简单示例

随着网络的发展,CSS 也在不断的完善,充分吸取多年来 Web 发展的需求,提出了很多新颖的 CSS 特性,例如很受欢迎的圆角矩形 border-radius 属性,但很可惜,此属性目前没有得到任何浏览器的支持. 对于一些浏览器,它们有其私有的圆角属性.如 FF 的 -moz-border-radius ,Safari 和 Chrome 的 -webkit-border-radius .效果见下图: FF 的圆角Safari 和 Chrome 的圆角(Safari 和 Chrome 使用的是同一

canvas 绘制圆角矩形

<!DOCTYPE HTML> <head> <meta charset = "utf-8"> <title>canvas</title> <style type="text/css"> #canvas{border:1px solid #eee ; display:block; background-color: #B36666; margin: 20px auto; } </style