html - 保存/恢复会影响 HTML5 画布中的 clip() 吗?
问题描述
我试图画一个“标注”。当我打电话clip()
时,它似乎受到标注部分的影响。
做save()
和restore()
不影响clip()
?
canvas = document.getElementById('Canvas');
ctx = canvas.getContext('2d');
//callout part
ctx.save();
ctx.moveTo(location[0].x, location[0].y);
ctx.lineTo(location[1].x, location[1].y);
ctx.lineTo(location[2].x, location[2].y);
ctx.lineTo(location[3].x, location[3].y);
ctx.lineTo(location[3].x, location[4].y);
ctx.lineTo(location[4].x, location[4].y);
ctx.lineTo(location[4].x, location[3].y);
ctx.lineTo(location[2].x, location[2].y);
ctx.stroke();
ctx.restore();
//text part
ctx.save();
ctx.rect(location[3].x, location[3].x, location[4].x - location[3].x, location[4].y - location[3].y);
ctx.clip();
ctx.fillText('test', location[3].x + 5 , location[3].y + 5);
ctx.restore();
解决方案
是的save()
,restore()
确实保存和恢复剪辑区域,但他们不保存和恢复当前的子路径声明。
您需要在调用ctx.beginPath()
之前调用rect()
,否则此矩形将添加到先前的子路径中,并且所有这些都将用于剪辑。
所以这意味着您的第一个保存/恢复块是无用的,因为它保存的任何内容都没有被修改:
canvas = document.getElementById('Canvas');
ctx = canvas.getContext('2d');
//callout part
ctx.beginPath();
ctx.moveTo(location[0].x, location[0].y);
ctx.lineTo(location[1].x, location[1].y);
ctx.lineTo(location[2].x, location[2].y);
ctx.lineTo(location[3].x, location[3].y);
ctx.lineTo(location[3].x, location[4].y);
ctx.lineTo(location[4].x, location[4].y);
ctx.lineTo(location[4].x, location[3].y);
ctx.lineTo(location[2].x, location[2].y);
ctx.stroke();
//text part
ctx.save();
ctx.beginPath();
ctx.rect(location[3].x, location[3].x, location[4].x - location[3].x, location[4].y - location[3].y);
ctx.clip();
ctx.fillText('test', location[3].x + 5 , location[3].y + 5);
ctx.restore();
推荐阅读
- go - 正确处理“切片结构”?(戈朗)
- swift - 表视图部分 Swift 中的重复项
- javascript - 如何将唯一对象插入 Mongo Db 或更新它
- python - 世界末日燃料挑战。正常线性代数失败(不使用马尔可夫链中的矩阵分叉)。6/10 测试用例仅通过
- javascript - 使用浏览器 Cookie 发出请求的 Chrome 扩展程序
- sql - 在 SQL/Spark 中使用窗口函数执行特定过滤器
- mysql - 在 WHERE (MySQL) 中使用创建的变量
- html - 是否可以使用 SVG 图像文件作为源来剪辑 HTML 元素?
- google-apps-script - 过滤掉行的范围不支持 getFilter().removeColumnFilterCriteria(col)
- python - 如何从另一个只有最后一个非负值的数据框创建数据框?