应用样式和色彩 您所在的位置:网站首页 js字体粗细怎么设置透明 应用样式和色彩

应用样式和色彩

2024-07-01 16:22| 来源: 网络整理| 查看: 265

可以通过一系列属性来设置线的样式。

lineWidth = value

设置线条宽度。

lineCap = type

设置线条末端样式。

lineJoin = type

设定线条与线条间接合处的样式。

miterLimit = value

限制当两条线相交时交接处最大长度;所谓交接处长度(斜接长度)是指线条交接处内角顶点到外角顶点的长度。

getLineDash()

返回一个包含当前虚线样式,长度为非负偶数的数组。

setLineDash(segments)

设置当前虚线样式。

lineDashOffset = value

设置虚线样式的起始偏移量。

通过以下的样例可能会更加容易理解。

lineWidth 属性的示例

这个属性设置当前绘线的粗细。属性值必须为正数。默认值是 1.0。

线宽是指给定路径的中心到两边的粗细。换句话说就是在路径的两边各绘制线宽的一半。因为画布的坐标并不和像素直接对应,当需要获得精确的水平或垂直线的时候要特别注意。

在下面的例子中,用递增的宽度绘制了 10 条直线。最左边的线宽 1.0 单位。并且,最左边的以及所有宽度为奇数的线并不能精确呈现,这就是因为路径的定位问题。

jsfunction draw() { var ctx = document.getElementById("canvas").getContext("2d"); for (var i = 0; i draw();

想要获得精确的线条,必须对线条是如何描绘出来的有所理解。见下图,用网格来代表 canvas 的坐标格,每一格对应屏幕上一个像素点。在第一个图中,填充了 (2,1) 至 (5,5) 的矩形,整个区域的边界刚好落在像素边缘上,这样就可以得到的矩形有着清晰的边缘。

如果你想要绘制一条从 (3,1) 到 (3,5),宽度是 1.0 的线条,你会得到像第二幅图一样的结果。实际填充区域(深蓝色部分)仅仅延伸至路径两旁各一半像素。而这半个像素又会以近似的方式进行渲染,这意味着那些像素只是部分着色,结果就是以实际笔触颜色一半色调的颜色来填充整个区域(浅蓝和深蓝的部分)。这就是上例中为何宽度为 1.0 的线并不准确的原因。

要解决这个问题,你必须对路径施以更加精确的控制。已知粗 1.0 的线条会在路径两边各延伸半像素,那么像第三幅图那样绘制从 (3.5,1) 到 (3.5,5) 的线条,其边缘正好落在像素边界,填充出来就是准确的宽为 1.0 的线条。

备注: 在这个竖线的例子中,其 Y 坐标刚好落在网格线上,否则端点上同样会出现半渲染的像素点(但还要注意,这种行为的表现取决于当前的 lineCap 风格,它默认为 butt;你可能希望通过将 lineCap 样式设置为 square 正方形,来得到与奇数宽度线的半像素坐标相一致的笔画,这样,端点轮廓的外边框将被自动扩展以完全覆盖整个像素格)。

还请注意,只有路径的起点和终点受此影响:如果一个路径是通过 closePath() 来封闭的,它是没有起点和终点的;相反的情况下,路径上的所有端点都与上一个点相连,下一段路径使用当前的 lineJoin 设置(默认为 miter),如果相连路径是水平和/或垂直的话,会导致相连路径的外轮廓根据相交点自动延伸,因此渲染出的路径轮廓会覆盖整个像素格。接下来的两个小节将展示这些额外的行样式。

对于那些宽度为偶数的线条,每一边的像素数都是整数,那么你想要其路径是落在像素点之间 (如那从 (3,1) 到 (3,5)) 而不是在像素点的中间。同样,注意到那个例子的垂直线条,其 Y 坐标刚好落在网格线上,如果不是的话,端点上同样会出现半渲染的像素点。

虽然开始处理可缩放的 2D 图形时会有点小痛苦,但是及早注意到像素网格与路径位置之间的关系,可以确保图形在经过缩放或者其他任何变形后都可以保持看上去蛮好:线宽为 1.0 的垂线在放大 2 倍后,会变成清晰的线宽为 2.0,并且出现在它应该出现的位置上。

lineCap 属性的示例

属性 lineCap 的值决定了线段端点显示的样子。它可以为下面的三种的其中之一:butt,round 和 square。默认是 butt。

在这个例子里面,我绘制了三条直线,分别赋予不同的 lineCap 值。还有两条辅助线,为了可以看得更清楚它们之间的区别,三条线的起点终点都落在辅助线上。

最左边的线用了默认的 butt 。可以注意到它是与辅助线齐平的。中间的是 round 的效果,端点处加上了半径为一半线宽的半圆。右边的是 square 的效果,端点处加上了等宽且高度为一半线宽的方块。

jsfunction draw() { var ctx = document.getElementById("canvas").getContext("2d"); var lineCap = ["butt", "round", "square"]; // 创建路径 ctx.strokeStyle = "#09f"; ctx.beginPath(); ctx.moveTo(10, 10); ctx.lineTo(140, 10); ctx.moveTo(10, 140); ctx.lineTo(140, 140); ctx.stroke(); // 画线条 ctx.strokeStyle = "black"; for (var i = 0; i draw(); lineJoin 属性的示例

lineJoin 的属性值决定了图形中两线段连接处所显示的样子。它可以是这三种之一:round、bevel 和 miter。默认是 miter。

这里我同样用三条折线来做例子,分别设置不同的 lineJoin 值。最上面一条是 round 的效果,边角处被磨圆了,圆的半径等于线宽。中间和最下面一条分别是 bevel 和 miter 的效果。当值是 miter 的时候,线段会在连接处外侧延伸直至交于一点,延伸效果受到下面将要介绍的 miterLimit 属性的制约。

jsfunction draw() { var ctx = document.getElementById("canvas").getContext("2d"); var lineJoin = ["round", "bevel", "miter"]; ctx.lineWidth = 10; for (var i = 0; i draw(); miterLimit 属性的演示示例

就如上一个例子所见的应用 miter 的效果,线段的外侧边缘会被延伸交汇于一点上。线段之间夹角比较大时,交点不会太远,但随着夹角变小,交点距离会呈指数级增大。

miterLimit 属性就是用来设定外延交点与连接点的最大距离,如果交点距离大于此值,连接效果会变成了 bevel。注意,最大斜接长度(即交点距离)是当前坐标系测量线宽与此miterLimit属性值(HTML 默认为 10.0)的乘积,所以miterLimit可以单独设置,不受显示比例改变或任何仿射变换的影响:它只影响线条边缘的有效绘制形状。

更准确的说,斜接限定值(miterLimit)是延伸长度(在 HTML Canvas 中,这个值是线段外连接点与路径中指定的点之间的距离)与一半线宽的最大允许比值。它也可以被等效定义为线条内外连接点距离(miterLength)与线宽(lineWidth)的最大允许比值(因为路径点是内外连接点的中点)。这等同于相交线段最小内夹角(θ)的一半的余割值,小于此角度的斜接将不会被渲染,而仅渲染斜边连接:

miterLimit = max miterLength / lineWidth = 1 / sin ( min θ / 2 ) 斜接限定值默认为 10.0,这将会去除所有小于大约 11 度的斜接。 斜接限定值为 √2 ≈ 1.4142136(四舍五入)时,将去除所有锐角的斜接,仅保留钝角或直角。 1.0 是合法的斜接限定值,但这会去除所有斜接。 小于 1.0 的值不是合法的斜接限定值。

在下面的小示例中,你可以动态的设置miterLimit的值并查看它对画布中图形的影响。蓝色线条指出了锯齿图案中每个线条的起点与终点(同时也是不同线段之间的连接点)。

在此示例中,当你设定miterLimit的值小于 4.2 时,图形可见部分的边角不会延伸相交,而是在蓝色线条边呈现斜边连接效果;当miterLimit的值大于 10.0 时,此例中大部分的边角都会在远离蓝线的位置相交,且从左至右,距离随着夹角的增大而减小;而介于上述值之间的值所呈现的效果,也介于两者之间。

jsfunction draw() { var ctx = document.getElementById("canvas").getContext("2d"); // 清空画布 ctx.clearRect(0, 0, 150, 150); // 绘制参考线 ctx.strokeStyle = "#09f"; ctx.lineWidth = 2; ctx.strokeRect(-5, 50, 160, 50); // 设置线条样式 ctx.strokeStyle = "#000"; ctx.lineWidth = 10; // 检查输入 if (document.getElementById("miterLimit").value.match(/\d+(\.\d+)?/)) { ctx.miterLimit = parseFloat(document.getElementById("miterLimit").value); } else { alert("Value must be a positive number"); } // 绘制线条 ctx.beginPath(); ctx.moveTo(0, 100); for (i = 0; i 在输入框中输入miterLimit的值,并点击重绘按钮查看效果。 Miter limit document.getElementById("miterLimit").value = document .getElementById("canvas") .getContext("2d").miterLimit; draw();


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有