我正在尝试使用JavaScript和画布创建 this 等应用程序。
我使用kineticjs作为画布库创建了一个草稿。牙齿都是png图像,线条由动态js使用Line对象绘制。
我的一位朋友建议我将所有东西画成一个大的svg(牙齿和线条),其中每个牙齿和线条是另一条尊贵的路径,将其加载到画布上,并使用ID来操纵它们并使用id来操纵它们
我试过阅读kineticjs docs和fabricjs对象,但没有找到类似的东西。我的意思是让svg存储并使用fabricjs或kineticjs将它加载到画布上。然后库应该解析它并在画布上创建svg,我可以通过id来操纵它们。
甚至可能吗?我对这个svg图形很新。它是否有可能像我一样思考它?
我目前正在使用KineticJS将牙齿作为图像加载
Periodontogram.prototype.initializeImageObjects = function (){
var obj = this;
if (this.DEBUG){
console.log("initializing ImageObjects:")
}
var check = function (item){return item !== undefined;}
var url = this.options.url;
var imageObj;
var image;
this.options.imageFilenames.forEach(function (filename, index){
if (obj.DEBUG){
console.log("Loading "+filename+" image");
}
var src = url+'/'+filename;
imageObj = new Image();
imageObj.src = src;
imageObj.onload = function (){
if (obj.DEBUG){
console.log("Image "+src+" successfully loaded");
}
image = new Kinetic.Image({
x:0,
y:0,
id: filename.split('.')[0],
width: this.width,
height: this.height,
image:this
});
obj.imageObjects[index] = this;
obj.teethImages[index] = image;
if (obj.imageObjects.filter(check).length === obj.options.imageFilenames.length ) {
if (obj.DEBUG){
console.log("All Images loaded successfully");
console.log("ready to call rest methods")
}
obj.positionImages();
obj.createLineGroups();
obj.createLabelGroups()
obj.createStage();
obj.drawOnScreen();
$("#"+obj.container).width(obj.stage.getWidth());
$("#"+obj.container).height(obj.stage.getHeight ());
obj.callback();
$.event.trigger({
type:'finishLoading',
obj: obj
});
}
};
});
}
我希望通过加载整个svg来替换所有这些,包括牙齿和线条。
答案 0 :(得分:1)
FabricJS 转换,分解&将现有的单个SVG URL /字符串重构到Fabric.PathGroup中。然后,您可以使用mySvgGroup.getObjects()
来获取您可以根据需要操作的各个牙齿路径。
http://fabricjs.com/fabric-intro-part-3/#deserialization
KineticJS将接受单个SVG牙齿的路径数据并将其显示在画布上。
http://kineticjs.com/docs/Kinetic.Path.html
尽管如此,为每颗牙齿创建单独的SVG路径并将这些单独的SVG喂入KineticJS或FabricJS可能更灵活。
然后你可以按照你想要的方式操纵它们: