javascript - px/em fabricjs 中的 StrokeWidth 值
问题描述
我正在向画布添加一个矩形/圆形,并使用范围类型输入更改 strokeWidth。如果我们有 strokeWidth:5 和 strokeWidth(1-10) 的范围,那么在 px/em/% 中的 strokeWidth 值是多少。实际上,每当我们尝试增加 strokeWidth 时,我想知道实际宽度以 px 为单位增加了多少。
检查代码例如:
var canvas = new fabric.Canvas('canvas1');
$('.add_shape').click(function() {
var cur_value = $(this).attr('data-rel');
if (cur_value != '') {
switch (cur_value) {
case 'rectangle':
var rect = new fabric.Rect({
left: 50,
top: 50,
fill: '#aaa',
width: 50,
height: 50,
opacity: 1,
stroke: '#000',
strokeWidth: 1,
noScaleCache: false,
strokeUniform: true,
});
canvas.add(rect);
canvas.setActiveObject(rect);
break;
case 'circle':
var circle = new fabric.Circle({
left: 50,
top: 50,
fill: '#aaa',
radius: 50,
opacity: 1,
stroke: '#000',
strokeWidth: 1,
noScaleCache: false,
strokeUniform: true
});
canvas.add(circle);
canvas.setActiveObject(circle);
break;
}
}
});
/* Control the border */
$('#control_border').change(function() {
var cur_value = parseInt($(this).val());
var activeObj = canvas.getActiveObject();
if (activeObj == undefined) {
alert('Please select the Object');
return false;
}
activeObj.set({
strokeWidth: cur_value
});
canvas.renderAll();
});
button {
max-resolution: 10px;
height: 30px;
}
div {
margin: 10px
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.7.0/fabric.min.js"></script>
<div>
<button class="add_shape" data-rel="circle">Add Circle</button>
<button class="add_shape" data-rel="rectangle">Add Rectangle</button>
<label class="control-label">Border</label>
<input id="control_border" type="range" min="0" max="10" step="1" value="0" />
</div>
<canvas id="canvas1" width="600" height="300" style="border:1px solid #000000;"></canvas>
解决方案
如果我正确理解了您的问题,我相信您想要的是计算对象和笔划的屏幕 CSS 像素大小。这会根据画布的缩放级别而变化,因此需要在计算中加以考虑。
这将为您提供以 CSS 像素(包括笔划)为单位的总对象尺寸:
var zoom = canvas.getZoom();
var totalWidth = obj.getScaledWidth() * zoom;
var totalHeight = obj.getScaledHeight() * zoom;
这将为您提供以 CSS 像素为单位的笔触大小:
var zoom = canvas.getZoom();
var strokeX = obj.strokeWidth * obj.scaleX * zoom;
var strokeY = obj.strokeWidth * obj.scaleY * zoom;
如果您使用该strokeUniform
属性,则笔触大小不会受到对象比例的影响,因此您可以这样做。
var zoom = canvas.getZoom();
var strokeSize = obj.strokeWidth * zoom;
此外,如果您的对象使用的paintFirst
值是stroke
笔划宽度的一半,则填充将覆盖,因此您需要将结果乘以 0.5 以获得可见的笔划宽度。
推荐阅读
- javascript - 如何等待外部文件功能完成然后继续主程序?
- java - 将 sLine 字符串解析为整数时出错
- regex - 用于捕获函数的 tmLanguage 正则表达式,它可以包含许多函数
- java - 如何使用 java 中的 Apache poi 读取从 Internet 下载的受保护视图中的 .xlsx 文件?
- google-kubernetes-engine - 验证数据时出错:使用 Helm 的 ValidationError(PersistentVolume.spec)
- python - django rest 框架使用 ArrayAgg 和 GROUP BY 进行注释
- google-sheets - Google 承诺可以将 Fusion 表格导入 Google 表格,但如何导入?
- javascript - 如何接受用户输入作为函数的参数?
- javascript - 内置函数对象方法如何使用比函数文字更多的内存?
- c# - 如何在我的冒泡排序中插入时间跨度?