红影 发表于 2022-3-3 21:30

马黑黑 发表于 2022-3-3 18:23
解释:
在画布上作画,每一次都要获得画布操作句柄、2d画笔句柄,所以,下面这几句中,



原来字体大小的px和长度里用的px是一回事,从来没注意这个{:4_173:}
这个双循环每次都觉得挺难的。
写得这么详细。黑黑辛苦了{:4_187:}

马黑黑 发表于 2022-3-3 21:33

红影 发表于 2022-3-3 21:30
原来字体大小的px和长度里用的px是一回事,从来没注意这个
这个双循环每次都觉得挺难的。
写 ...

关于双循环:外层每循环一次,内层就完整循环一遍。

例如,外循环如果循环3遍,内循环设定为循环5遍,那么,内循环总共要循环 3*5 = 15 遍

马黑黑 发表于 2022-3-3 22:42

本帖最后由 马黑黑 于 2022-3-3 22:53 编辑 <br /><br /><canvas id="txtCv1" width="400" height="400" style="border:1px solid;">浏览器老</canvas>

<script>

var canv1 = document.getElementById('txtCv1');
var ctx = canv1.getContext('2d');
ctx.font = "bold 60px 宋体";
var grd = ctx.createLinearGradient(0,0,0,280);
grd.addColorStop(0,"green");
grd.addColorStop(0.2,"red");
grd.addColorStop(0.4,"tan");
grd.addColorStop(0.6,"blue");
grd.addColorStop(0.8,"olive");
grd.addColorStop(1,"tomato");
ctx.fillStyle = grd;
var txtStr = "鋤禾日當午,汗滴禾下土。誰知盤中餐,粒粒皆辛苦。";
var ttWidth = ctx.measureText(txtStr).width; //获得文本占位总长度

if(ttWidth > canv1.width){ //若文本长度大于画布长度
        var txtAr = txtStr.split(""); //将文本逐字放入数组
        var cWidth = ttWidth / txtAr.length; //计算单字长度
        //计算每行能装多少个字:cNum
        var cNum = Math.floor(canv1.width * 0.9 / cWidth);
        //计算需要多少行:lNum
        var lNum = Math.ceil(txtAr.length / cNum);

        for(j=0; j<lNum; j++){
                var tmpStr = "";
                for(k=0; k<cNum; k++){
                        if(j*cNum+k < txtAr.length) tmpStr += txtAr;//console.log(j*cNum+k);
                }
                ctx.fillText(tmpStr,20,j*70+70);
        }
} else {
        ctx.fillText(txtStr,20,70);
}

</script>

马黑黑 发表于 2022-3-3 22:55

比较一下 23# 和 二楼演示的效果,宽度因为字体修饰的关系,23# 单字的占位宽度实际上比二楼的多了一些尺寸

马黑黑 发表于 2022-3-3 23:02

之所以出现这样的问题,仅仅在于字体的变化:2楼用微软雅黑,23#用宋体。

估计如果给文字设置阴影,单字的占位也会发生变化。

红影 发表于 2022-3-4 10:12

大猫咪 发表于 2022-3-3 21:28
嗯嗯

不过我就算知道了,也经常忘{:4_173:}

红影 发表于 2022-3-4 10:33

马黑黑 发表于 2022-3-3 21:29
var cWidth = ttWidth / txtAr.length;

单字长度就是单一字符个体所占的宽度像素值。我们已经知道有多 ...

比较搅的是,先用字符宽度计算每行多少个汉字,然后又用个数的长度相除得到行数。
也就是宽度和数量来回折腾被折腾迷糊了。最主要split() 方法一下子没理解,“我们获取数组 txtAr 的长度实际上就等于字符串 txtStr 的字符个数,它将参与到后续的计算中。”

红影 发表于 2022-3-4 10:35

马黑黑 发表于 2022-3-3 22:55
比较一下 23# 和 二楼演示的效果,宽度因为字体修饰的关系,23# 单字的占位宽度实际上比二楼的多了一些尺寸

渐变的修饰也会引起单个字体长度的变化?

红影 发表于 2022-3-4 10:36

马黑黑 发表于 2022-3-3 23:02
之所以出现这样的问题,仅仅在于字体的变化:2楼用微软雅黑,23#用宋体。

估计如果给文字设置阴影,单字 ...

哦,不同的字体风格也有影响的啊。

马黑黑 发表于 2022-3-4 13:50

红影 发表于 2022-3-4 10:36
哦,不同的字体风格也有影响的啊。

是的。文字各异,设计的标准也有所不同。大体上,微软雅黑是等宽的字体,但也不纯粹,纯粹的等宽字体是win7及其低版本Windows默认使用的fixdays字体。

马黑黑 发表于 2022-3-4 13:50

红影 发表于 2022-3-4 10:35
渐变的修饰也会引起单个字体长度的变化?

这个不会,是字体问题

红影 发表于 2022-3-4 21:46

马黑黑 发表于 2022-3-4 13:50
是的。文字各异,设计的标准也有所不同。大体上,微软雅黑是等宽的字体,但也不纯粹,纯粹的等宽字体是wi ...

涉及到字体,感觉要算准还挺不容易的。

红影 发表于 2022-3-4 21:46

马黑黑 发表于 2022-3-4 13:50
这个不会,是字体问题

嗯嗯,知道了。

马黑黑 发表于 2022-3-4 21:47

红影 发表于 2022-3-4 21:46
涉及到字体,感觉要算准还挺不容易的。

所以有这个measureText方法

红影 发表于 2022-3-4 22:39

马黑黑 发表于 2022-3-4 21:47
所以有这个measureText方法

原来所有的命令都是应需而出现的{:4_204:}

马黑黑 发表于 2022-3-4 23:31

红影 发表于 2022-3-4 22:39
原来所有的命令都是应需而出现的

那必须的

红影 发表于 2022-3-5 10:00

马黑黑 发表于 2022-3-4 23:31
那必须的

要记住这么多命令很不容易的。

马黑黑 发表于 2022-3-5 21:42

红影 发表于 2022-3-5 10:00
要记住这么多命令很不容易的。

所以要理解,理解之后基本不存在记忆问题

红影 发表于 2022-3-5 22:41

马黑黑 发表于 2022-3-5 21:42
所以要理解,理解之后基本不存在记忆问题

理解了,也还是需要记住命令是什么的。

马黑黑 发表于 2022-3-5 22:49

红影 发表于 2022-3-5 22:41
理解了,也还是需要记住命令是什么的。

理解了基本不用去背
页: 1 [2] 3 4
查看完整版本: 画布中文本自动折行的演示