html canvas文本-文本的描边与填充


几乎每个基于CANVAS的应用程序都要同文本打交道。某些应用程序仅仅是配置并显示文本而已,然而另外一些应用程序则会支持复杂的文本编辑。

canvas元素只支持及少数的文本操作功能,在写作本书时,它尚未提供那些在很多基础的文本编辑器中都能找到的功能,例如文本选择、复制与粘贴,以及文本滚动等。不过,它也提供了一些必备的基本功能,例如文本的描边与填充,向canvas之中放置文本,以及用像素为单位来计算任意字符串的宽度等。canvas的绘图环境对象提供了如下3个与文本有关的方法:

strokeText(text,x,y)

fillText(text,x,y)

measureText(text)

measureText()方法所返回的对象中,包含一个名为width的属性,它的值代表你传递给该方法的文本所占据的宽度。canvas的绘图环境对象中有三个与文本有关的属性;

font

testAlign

textBaseline

用户可以通过font属性来设置稍后绘制时所使用的字型,而textAlign与textBaseline属性则可以让用户设置文本在canvas之内的定位方式。现在就来详细地讲讲这些方法和属性。

文本的描边与填充。

该应用程序提供了一些复选框,让用户可以通过它们来控制是否要对所绘文本进行描边、填充及运用阴影效果。

该段javascript代码获取了指向那三个复选框对象的引用,并分别向每个控件中增加了一个用于绘制背景及文本的onchange事件处理器。

此范例应用程序分别使用fillText()与strokeText()方法来对文本进行填充与描边操作。这两个方法都接受三个参数,第一个参数是所要绘制的文本,剩下的两个参数指定文本的绘制位置。所画文本的精确位置,要取决于textAlign与textBaseline属性。

html代码:

 1 <head>
 2       <title>Stroking and Filling Text</title>
 3       <style>
 4         body {
 5            background: #eeeeee;
 6         }
 7         
 8         #canvas {
 9             margin-left: 10px;
10               -webkit-box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 4px;
11               -moz-box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 4px;
12               box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 4px;
13               border: 1px solid cornflowerblue;
14               background: #ffffff;
15         }
16 
17         #controls {
18            margin: 10px;
19         }
20       </style>
21    </head>
22 
23    <body>
24       <div id='controls'>
25          <input id='strokeCheckbox' type='checkbox' checked/>Stroke
26          <input id='fillCheckbox' type='checkbox' checked/>Fill
27          <input id='shadowCheckbox' type='checkbox' checked/>Shadow
28       </div>
29       
30       <canvas id='canvas' width='600' height='220'>
31          Canvas not supported
32       </canvas>
33 
34       <script src='example.js'></script>
35    </body>
36 </html>

example.js代码:

 1 var canvas = document.getElementById('canvas'),
 2     context = canvas.getContext('2d'),
 3 
 4     fillCheckbox   = document.getElementById('fillCheckbox'),
 5     strokeCheckbox = document.getElementById('strokeCheckbox'),
 6     shadowCheckbox = document.getElementById('shadowCheckbox'),
 7 
 8     text='HTML5';
 9 
10 // Functions..........................................................
11 
12 function draw() {
13    context.clearRect(0, 0, canvas.width, canvas.height);
14    drawBackground();
15 
16    if (shadowCheckbox.checked) turnShadowsOn();
17    else                        turnShadowsOff();
18 
19    drawText();
20 }
21 
22 function drawBackground() {  // Ruled paper
23    var STEP_Y = 12,
24        TOP_MARGIN = STEP_Y * 4,
25        LEFT_MARGIN = STEP_Y * 3,
26        i = context.canvas.height;
27 
28    // Horizontal lines
29    
30    context.strokeStyle = 'lightgray';
31    context.lineWidth = 0.5;
32 
33    while(i > TOP_MARGIN) { 
34       context.beginPath();
35       context.moveTo(0, i);
36       context.lineTo(context.canvas.width, i);
37       context.stroke();
38       i -= STEP_Y;
39    }
40 
41    // Vertical line
42    
43    context.strokeStyle = 'rgba(100,0,0,0.3)';
44    context.lineWidth = 1;
45 
46    context.beginPath();
47 
48    context.moveTo(LEFT_MARGIN,0);
49    context.lineTo(LEFT_MARGIN,context.canvas.height);
50    context.stroke();
51 }
52 
53 function turnShadowsOn() {
54    if (navigator.userAgent.indexOf('Opera') === -1) {
55       context.shadowColor = 'rgba(0, 0, 0, 0.8)';
56    }
57       context.shadowOffsetX = 5;
58       context.shadowOffsetY = 5;
59       context.shadowBlur    = 10;
60 }
61 
62 function turnShadowsOff() {
63    if (navigator.userAgent.indexOf('Opera') === -1) {
64       context.shadowColor = undefined;
65    }
66       context.shadowOffsetX = 0;
67       context.shadowOffsetY = 0;
68       context.shadowBlur    = 0;
69 }
70 
71 function drawText() {
72    var TEXT_X = 65,
73        TEXT_Y = canvas.height/2 + 35;
74 
75    context.strokeStyle = 'blue';
76 
77    if (fillCheckbox.checked)   context.fillText  (text, TEXT_X, TEXT_Y);
78    if (strokeCheckbox.checked) context.strokeText(text, TEXT_X, TEXT_Y);
79 }
80 
81 // Event handlers.....................................................
82 
83 fillCheckbox.onchange   = draw;
84 strokeCheckbox.onchange = draw;
85 shadowCheckbox.onchange = draw;
86 
87 // Initialization.....................................................
88 
89 context.font = '128px Palatino';
90 context.lineWidth = 1.0;
91 context.fillStyle = 'cornflowerblue';
92 
93 turnShadowsOn();
94 
95 draw();

fillText()与strokeText()方法还会接受一个可选的第四参数,该参数以像素为单位指定了所绘文本的最大宽度。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM