在上一篇文章 PixiJs学前篇(二):Canvas基础【中篇】 中我们了解了Canvas的基本绘制形状,接下来我们看一下如何在 Canvas 中绘制文本。
文本的绘制也是 Canvas 中也是比较常见的,在 Canvas 的绘制中,其实除了图片的绘制基本就是文字的绘制,两者基本五五开,下面我们开始看一下文本是如何让绘制的。
文本的绘制和基本形状的绘制一样,分为描边和填充两种,下面我们分别看一下效果
strokeText()方法是以描边的方式绘制文字的
ctx.strokeText(txt, x, y, maxWidth)
下面举个例子看一下:
canvas - 文本
当前浏览器不支持canvas元素,请升级或更换浏览器!
复制代码
效果如下
如图我们看到,效果和我们预想的似乎并不一致,说好的描边,怎么感觉是“实心”的。其实这是文本绘制使用的是默认的字号和字体,导致看起来与预期的结果不太一致,这边我们设置一下字号和字体,再看一下效果
代码如下:
canvas - 文本
当前浏览器不支持canvas元素,请升级或更换浏览器!
复制代码
效果如下:
如图,效果就很明显是,是按文字的轮廓来绘制,但又有一个问题,咱们的文字超出了画布本身,那么咱们可用可续那参数: 最大宽度来限制一下看看是什么效果: 代码如下:
canvas - 文本
当前浏览器不支持canvas元素,请升级或更换浏览器!
复制代码
效果如下:
如图我们可以看出,文案的长度被限制到了画布中,这里需要我们注意的是当文案大于最大宽度时不是裁剪或者换行,而是缩小。
fillText()方法是以填充的方式绘制文字的
ctx.fillText(txt, x, y, maxWidth)
下面举个例子看一下fillText()
和 strokeText()
方法的区别。
canvas - 文本
当前浏览器不支持canvas元素,请升级或更换浏览器!
复制代码
效果如下:
如图我们可以明显看出fillText()
和 strokeText()
方法绘制的区别。在之后的实践中我们可以按需求来选择用什么方式来绘制文本。
上面的例子中我们说道了一个属性:font
,我们通过它设置了文本的样式,下面我们统一说一下在文本的绘制中,究竟有哪些文本样式可以设置。
在文本的绘制中,样式的设置是不可或缺的,下面我们来看看究竟有哪些样式可以让我们的文本更加丰富多彩。
font
属性的设置可以改变字号和字体,不设置的情况下默认是:10px sans-serif
。
举个例子看一下:
canvas - 文本
当前浏览器不支持canvas元素,请升级或更换浏览器!
复制代码
效果如下:
textAlign
属性的设置可以改变文本对齐的方式。默认值是 start
,可选值有:left
、right
、center
、start
和end
。
举个例子看一下:
canvas - 文本
当前浏览器不支持canvas元素,请升级或更换浏览器!
复制代码
效果如下:
如图我们可以看到各个参数对应的效果,我们会发现start
和left
的效果基本一样,还有end
和right
的效果也基本一样,那么start
和left
,end
和right
是不是等价的呢?答案肯定是否定的。因为如果是等价的那就没必要设置两个属性了。
那他们既然不一样,那他们有什么区别呢?这我们需要结合另一个属性:direction
来看。
direction
属性可以设置文本的方向。默认值是 inherit
, 可选值为:ltr
(文本方向从左向右)、rtl
(文本方向从右向左)、inherit
(根据情况继承 Canvas元素或者 Document 。)。
下面我们先举个例子看一下 direction
属性的各个值得效果:
canvas - 文本
当前浏览器不支持canvas元素,请升级或更换浏览器!
复制代码
效果如下:
了解了direction
属性以后我们再来看看上面说到的textAlign
属性的值start
和left
,end
和right
的区别。
举个例子看一下:
canvas - 文本
当前浏览器不支持canvas元素,请升级或更换浏览器!
复制代码
效果如下:
如图我们可以发现, direction
属性会对 textAlign
属性产生影响。
如果 direction
属性设置为 ltr
,则textAlign
属性的 left
和 start
的效果相同,right
和 end
的效果相同,
如果 direction
属性设置为 rtl
,则 textAlign
属性的 left
和 end
的效果相同,right
和 start
的效果相同。
textBaseline
属性设置基于基线对齐的文字垂直方向的对齐方式。默认值是alphabetic
,可选值为:top
、hanging
、middle
、alphabetic
、ideographic
和bottom
。
举个例子看一下不同属性值的样式:
canvas - 文本
当前浏览器不支持canvas元素,请升级或更换浏览器!
复制代码
效果如下:
文字设置阴影是文字绘制中常见的一种使用,绘制上阴影会让字体看起来更加立体。
Canvas中可以通过四个属性来设置阴影效果,下面我们看看这四个效果各自具体的效果。
shadowOffsetX
shadowOffsetX属性用于设置阴影在 X轴 上的延伸距离,默认值为0,如设置为10,则表示延 X轴 向右延伸10像素的阴影,也可以为负值,负值表示阴影会往反方向(向左)延伸。
shadowOffsetY
shadowOffsetY属性用于设置阴影在 Y轴 上的延伸距离,默认值为0,如设置为10,则表示延 Y轴 向下延伸10像素的阴影,也可以为负值,负值表示阴影会往反方向(向上)延伸。
shadowBlur
shadowBlur属性用于设置阴影的模糊程度,默认为 0。
shadowColor
shadowColor属性用于设置阴影的颜色,默认为全透明的黑色。
举个例子看一下上面四个属性的效果:
canvas - 文本
当前浏览器不支持canvas元素,请升级或更换浏览器!
复制代码
效果如下:
measureText
这个对象有很多属性,其中width
属性用于基于当前上下文字号和字体来计算内联字符串的宽度。
我们看一下具体的用法:
canvas - 文本
当前浏览器不支持canvas元素,请升级或更换浏览器!
复制代码
效果如下:
如图可以看出,相同的文本,在不同的字体时,文字的大小是不一样的,在我们的案例中(专栏开始说的案例),涉及到文本的修改,在修改的时候其实就涉及到需要测量文本的宽度去修改编辑框的宽度,因为 Canvas 绘制的文本是不可编辑的,所以编辑的时候需要用DOM做一个假的编辑框覆盖在 Canvas 绘制的文案上面,编辑的时候就根据DOM中文字的内容来通过上述案例计算宽度,再渲染 Canvas 上的文本。
measureText
对象还有很多属性,但兼容性都不是很好,且这些属性都是只读属性,下面列一下。
注意:measureText
对象上的这些属性,都是使用 CSS 像素计算的,且都是只读属性。
上面我们说了文字的绘制,下面我们介绍一下图像的绘制。
如何把图片绘制到 Canvas 中,在上一篇文章 PixiJs学前篇(二):Canvas基础【中篇】 中,我们介绍的图像样式可以通过 createPattern 方法把图片绘制到Canvas中。
现在我们介绍一个专门用于把图片绘制到 Canvas 中的方法: drawImage
,并且 drawImage
方法会根据不同的传参实现不同的功能:绘制图像、缩放图像、裁剪图像。
drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)
下面我们分别看看传不同的参数如何实现不同的功能。以下面这张图片作为元素绘制:
单纯的图片绘制只需要image
、dx
和dy
三个参数。 举个例子看一下:
canvas - 图像绘制
当前浏览器不支持canvas元素,请升级或更换浏览器!
复制代码
效果如下:
如图元素已经绘制到 Canvas 中,但可以看到图片绘制并不完整。那么想完整的绘制这张图片我们就需要在缩放图片。如何缩放呢?看下面的例子
想缩放图片就需要在绘制的前提下再设置图片的宽高,也就还需要dWidth
和dHeight
这两个参数。
举个例子看一下:
canvas - 图像绘制
当前浏览器不支持canvas元素,请升级或更换浏览器!
复制代码
效果如下:
如图元素已经整个的绘制到 Canvas 中了,那如果我们只需要把图片中的人物绘制到 Canvas 中,那么我们就需要对图片进行裁剪。那如何裁剪呢?
想裁剪图片就需要在缩放的前提下再设置图片要显示的位置和裁剪的大小,也就还需要sx
、sy
、sWidth
和sHeight
这四个参数。
举个例子看一下:
canvas - 图像绘制
当前浏览器不支持canvas元素,请升级或更换浏览器!
复制代码
效果如下:
综上所述,我们可以通过给 drawImage
方法传不同的参数来实现不同的内容。