Svg 在raphael.js中,调整笔划大小后,笔划宽度发生了荒谬的变化

Svg 在raphael.js中,调整笔划大小后,笔划宽度发生了荒谬的变化,svg,raphael,transform,scale,Svg,Raphael,Transform,Scale,我有两个类似的svg对象。我将其中一个缩放3,然后做一些事情。然后,我将其调整为原始大小(比例为1)。然而,奇怪的是它的笔划宽度变小了 这是一个错误还是我遗漏了什么?是否有一个简单的变通/破解方法?我画了无数的形状。 任何帮助都将不胜感激 完整的代码是 pageWidth = $(window).width(); pageHeight = $(window).height(); r = Raphael("holder",pageWidth, pageHeight); r.setStart();


我有两个类似的svg对象。我将其中一个缩放3,然后做一些事情。然后,我将其调整为原始大小(比例为1)。然而,奇怪的是它的笔划宽度变小了

这是一个错误还是我遗漏了什么?是否有一个简单的变通/破解方法?我画了无数的形状。 任何帮助都将不胜感激

完整的代码是

pageWidth = $(window).width();
pageHeight = $(window).height();
r = Raphael("holder",pageWidth, pageHeight);

r.setStart();
circ = r.circle(250,250,100,100).attr({'stroke-width':10, 'fill':'green'});
rct = r.rect(200,200,100,100).attr({'stroke-width':2,'fill':'grey'});

st = r.setFinish();

circ2 = r.circle(350,450,100,100).attr({'stroke-width':10, 'fill':'green'});
rct2 = r.rect(300,400,100,100).attr({'stroke-width':2,'fill':'grey'});


x = circ.attr('cx');
y = circ.attr('cy');

setTimeout(function(){st.animate({'transform':'s3,3,'+x+','+y},1500)},1000);

setTimeout(function(){st.animate({'transform':'s1,1'},1500)},3000);
试试这个

setTimeout(function(){st.animate({'transform':'s3,3,'+x+','+y},1500)},1000);
setTimeout(function(){st.animate({'transform':'s1,1,'+x+','+y},1500)},3000);

据我所知,这是关于抗锯齿的。你可以试试这个:

//setTimeout(function(){st.animate({'transform':'s3,3,'+x+','+y},1500)},1000);
//setTimeout(function(){st.animate({'transform':'s1,1'},1500)},3000);
setTimeout(function(){st.animate({'transform':'t1,1'},15000)},3000);

我也有同样的问题

具体地说,当鼠标在圆上时,使用动画增加圆的大小,笔划宽度变为动画中应该的1/2,在后续动画中,它将在“增长”动画中恢复其适当大小,但在动画结束时再次变为半宽,并在“收缩”动画期间和之后保持一半大小。宽度的变化没有设置动画——例如,在不断增长(带有反弹)动画的最后一端,线条将“弹出”到较窄的宽度。这与上面原始问题中JSFIDLE示例的错误行为有所不同,但下面的修复程序修复了这两个问题

受Phillippe Deschaseaux的(Neil在上面的评论中指出)和Phillippe的类似问题的启发,我发现类似的修复方法解决了这个问题

具体来说,在raphael.js中注释掉以下6行:

                case "stroke-width":
                    //if (o._.sx != 1 || o._.sy != 1) {
                    //    value /= mmax(abs(o._.sx), abs(o._.sy)) || 1;
                    //}
                    //if (o.paper._vbSize) {
                    //    value *= o.paper._vbSize;
                    //}
                    node.setAttribute(att, value);
(是的,这正是德拉甘斯(对其公认答案)的评论所暗示的问题所在。)

Phillippe解决问题的方法是消除最后三条注释线,这三条注释线在调整容器大小时调整笔划宽度(Phillippe正在做的),而解决我问题的方法是消除前三条注释线,这三条注释线根据对象的比例调整笔划宽度(我正在做的)。当然,消除所有6行可以解决这两个问题

我怀疑这是一个依赖于平台的问题。(我使用的是Safari。)在这种情况下,对raphael.js的正确修复将比删除这六行更复杂,也许可以解释为什么它还没有被修复(以及为什么这六行最初被写入)


换句话说,如果您的代码需要在各种浏览器上正确运行,那么您应该进行一些检查,看看哪些浏览器/版本需要这六行代码,哪些浏览器/版本需要这六行代码。如果你这样做,一定要给德米特里·巴拉诺夫斯基发一张便条

看看这个,可能是相关的-@Neil那个链接不起作用了,好像已经移到这里了:对不起,我昨天太忙了。我会试着让你知道它是否有效。将中心坐标附加到s1,1有效。然而,我无法理解你的第二个片段,因为它没有什么新功能。忽略它。关于aa我错了。事实上,如果按因子3缩放对象,笔划宽度将按1/3缩放?!缩放到原始大小后,笔划宽度保持不变。可能是图书馆里的虫子。我很快阅读了scale参数解析。在lib中查找else if(命令==“s”)。这部分看起来还可以。对于“S”命令而不是“S”,调用了Part if(绝对)命令。可能的错误可能是在案例“笔划宽度”之后:尽管这个问题并不新鲜,但感谢这个值得注意的答案。当时我使用了变通方法(即追加
s1,1
)并完成了项目。我希望它能帮助别人。