Paper.js获胜'无法正确调整画布大小
Paper.js won't resize the canvas correctly
我尝试Paper.js是为了好玩,但似乎一开始就被卡住了。
将resize="true"
添加到canvas
标记中可以使元素与浏览器窗口一样高和宽。然而,这样做会导致一些相当奇怪的行为。
我希望画布在加载页面后立即调整到视口,但它没有这样做,这就是为什么我最初认为它根本没有调整大小的原因。然而,实际发生的情况更为奇怪:画布以其默认大小300x150开始,当我调整视口大小时,它会缓慢但无限地增长。
记录在案,我曾尝试过使用data-paper-resize="true"
或仅使用resize
,或使用Chrome而不是Firefox,但都无济于事。
如果这个问题是由我端的一些莫名其妙的奇怪设置引起的,我不希望得到答案。然而,我想知道这个问题是否常见(甚至已知存在),是否有已知的原因和解决方案。
这是我正在使用的代码:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<script type="text/javascript" src="paper-full.min.js"></script>
<script type="text/paperscript" canvas="myCanvas">
var path = new Path();
path.strokeColor = 'black';
path.moveTo(new Point(120, 120));
path.lineTo(new Point(500, 500));
</script>
</head>
<body>
<canvas id="myCanvas" style="border: 1px dotted red;" resize="true"></canvas>
</body>
</html>
将以下CSS添加到您的项目中:
<style type="text/css">
html,
body {
margin: 0;
overflow: hidden;
height: 100%;
}
/* Scale canvas with resize attribute to full size */
canvas[resize] {
width: 100%;
height: 100%;
}
</style>
我在Github上为此打开了一个问题,似乎这是0.9.22中引入的一个bug@斯卡尔卡兹向我提出了这个问题。
以下是悬而未决的问题:https://github.com/paperjs/paper.js/issues/662.
您也可以在等待修补程序时降级到0.9.21。
对于任何仍然遇到这个问题的人来说,以下是在我的TypeScript/Rect项目中对我有效的方法。我遇到了一些问题,Paper.js的调整大小逻辑似乎与我应用程序中其他地方的现有调整大小逻辑冲突/不同步(可能正在进行一些数据竞赛)。无论哪种方式,我都意识到可以手动更新画布的viewSize。
使用lodash debounce,一旦用户调整了窗口的大小,就可以用实际的画布大小重新校准Paper.js视图。对于我的例子,我选择只在用户完成500ms的大小调整后才这样做,这样在调整大小时不会引起性能问题,也可以确保所有样式都已经正确更新和重新渲染。下面是我看到的TypeScript/Rect示例,它现在似乎运行良好:
export default function ChalkboardCanvas() {
// get a direct reference to the canvas element
const canvasRef = useRef(null);
/**
* Sometimes the Paper.js view gets out of sync when resizing
* manually update it instead once the user is done resizing
*/
const onResize = useCallback(debounce(() => {
if (canvasRef.current) {
const { width, height } = canvasRef.current.getBoundingClientRect();
paper.view.viewSize = new paper.Size(width, height);
}
}, 500, {
leading: false,
trailing: true,
}), []);
useEffect(() => {
window.addEventListener('resize', onResize);
return () => window.removeEventListener('resize', onResize);
}, [onResize]);
return (
<canvas
style={{
width: '100%',
height: '100%',
}}
ref={canvasRef}
resize="true"
/>
);
}
另一个选项是-如果您使用设置的比例(相对于主体)-覆盖纸张的视图:
var pageWidth = document.getElementsByTagName("BODY")[0].clientWidth
var pageHeight = document.getElementsByTagName("BODY")[0].clientHeight
view.size.width = pageWidth * myWidthScale
view.size.height = pageHeight * myHeightScale
center = new Point(width / 2, pageHeight / 2)
view.center = center
- Chrome应用程序调整窗口大小保持纵横比
- 调整屏幕大小后不显示子菜单
- 使用JavaScript根据窗口/视口的高度动态调整图像大小
- Adobe Air SDK在页面加载时调整窗口大小
- 在javascript中调整图像大小
- HTML5在浏览器大小javascript/jquery上调整字体大小
- 使用CSS、HTML和Javascript在随机图像的页面上调整图像大小
- 如何在Node.js中调整图像大小
- 如何动态调整文本大小以适应元素以防止拉伸
- 如果iframe通过单击加载,则自动调整iframe大小无效
- 在不影响原始画布外观的情况下调整图像大小
- 未注释img´除非调整浏览器大小、缩放或打开开发工具,否则不会显示
- 我需要一种自动调整iframe大小的方法,无论我查到什么,它都不起作用
- fabric.js:使用 Image.set() 调整图像大小是否会降低图像质量
- 自动调整字体大小以适合容器
- 在客户端上传之前调整图像大小,在IE9上无需Flash
- 如何检查是否调整浏览器大小的条件
- Div 设置为视口高度,即使调整屏幕大小也是如此
- 谷歌地图在我调整网页大小之前显示得不好
- 将图片上传到服务器,服务器调整图片大小并进行压缩,最后将结果发送到源CDN