wag*_*ter 4 javascript canvas fabricjs
我用 Fabric.js 在画布上绘制了一座六层楼的建筑。为了只显示一层,我这样做:
building.selectFloor = function(floorId){
for (var i = 0; i < floors.length; i++){
if (floorId == floors[i].name){
floors[i].visible = true;
}else{
floors[i].visible = false;
}
}
canvas.renderAll();
};
Run Code Online (Sandbox Code Playgroud)
但一切都没有改变——所有楼层仍然可见。设置为visible = false的楼层不会消失,直到稍后在调整窗口大小时调用renderAll():
$(window).resize(setSize);
setSize();
function setSize(){
viewportWidth = $(window).width();
viewportHeight = $(window).height();
$appContainer.css({ "width": viewportWidth, "height": viewportHeight});
canvas.setDimensions({ width: viewportWidth, height: viewportHeight });
if (canvas.building){
canvas.building.center();
canvas.building.scaleX = canvas.building.scaleY = (viewportWidth + viewportHeight) / (1920 + 1080);
canvas.renderAll();
}
}
Run Code Online (Sandbox Code Playgroud)
但随后它们就消失了。为什么一个 renderAll() 可以工作,而另一个却不能?我尝试将不起作用的 renderAll() 包装在 window.timeOut 中,看看延迟是否有帮助,但没有运气。
好吧 - 所以我最后想通了:building是一个似乎被某些内部结构魔法缓存的组,并且正在渲染缓存的版本而不是更新的版本。要呈现更新的版本,您必须执行此操作
canvas.building.set('dirty', true);
canvas.renderAll();
Run Code Online (Sandbox Code Playgroud)
希望对下线的人有所帮助。
编辑
事实证明还有一个更简单的解决方案:
canvas.building.objectCaching = false
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9800 次 |
| 最近记录: |