|
|
请马上登录,朋友们都在花潮里等着你哦:)
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 马黑黑 于 2022-8-16 21:26 编辑
记得之前讨论canvas画布时提到过,画布处理文本不会自动换行。故此,令一首小诗自下而上循环移动,需要做额外处理,让其分行绘制文本。
文本的绘制,canvas画布里,可以使用 fillText 和 strokeText 方法,语法一样(ctx是画笔句柄):
ctx.fillText('文本', x, y);
ctx.strokeText('文本', x, y);
一般地,X坐标是固定的,我们处理好Y坐标就能分行。第一行,Y坐标是50,则第二行则是 100,第三行150,第四行200。依此原理,我们可以通过for循环语句一口气写好四行诗。假设诗歌已经按行放入了数组 txtAr:
let hy = 0; //Y坐标初始值
for(j = 0; j < txtAr.length; j ++) {
hy += 50; //每次循环代表一行,Y坐标加50
ctx.fillText(txtAr[j], 10, hy ); //绘在 {10, hy} 处绘制各行文本
}
以上是一次性分行绘制出了全诗。
下一步是移动:我们令一个变量不停地加1,这个变量又去影响 hy 变量,而每一次影响,画布都重新绘制一次全诗文本,达到上升的目的,再加上限制变量处理机制,循环往复的上升就能实现。
下面是完整代码:
<style>
#papa { margin: auto; width: 720px; height: 460px; position: relative; }
#canv { position: absolute; left: 20px; top: 10px; border: 1px solid; }
</style>
<div id="papa">
<canvas id="canv" width="320" height="500"></canvas>
</div>
<script>
let ctx = canv.getContext('2d'); //画笔
let w = canv.width, h = canv.height; //宽高变量
let step = 1, yy = h; //步进、Y坐标变量
let txtAr = [
'荆溪白石出,',
'天寒红叶稀。',
'山路元无雨,',
'空翠湿人衣。'
];
(function moveText() {
ctx.clearRect(0, 0, w, h); //清空画布
ctx.strokeStyle = 'hsl(20, 100%, 50%)'; //也可以用 fillStyle 和其他颜色表达法
ctx.font = 'bold 50px 黑体'; //字号 50 :行距的依据是它
let hy = yy; //hy是Y坐标,书写整诗用(yy变量用于令步幅上升)
for(j = 0; j< txtAr.length; j ++) {
hy += 50; //各行的距离拉开50px(字号值)
ctx.strokeText(txtAr[j], 10, hy); //画一行字(也可以用fillText)
}
yy -= step; //yy变量自增
if (yy <= -200) yy = h; //200的依据:行数×字号
requestAnimationFrame(moveText); //定时器调用本函数
})();
</script>
效果放在二楼。
|
评分
-
| 参与人数 4 | 威望 +160 |
金钱 +320 |
经验 +160 |
收起
理由
|
加林森
| + 30 |
+ 60 |
+ 30 |
很给力! |
小辣椒
| + 50 |
+ 100 |
+ 50 |
赞一个! |
红影
| + 50 |
+ 100 |
+ 50 |
赞一个! |
醉美水芙蓉
| + 30 |
+ 60 |
+ 30 |
赞一个! |
查看全部评分
|