javascript - 这个 Raphael JS 扩展的作者已经从互联网上消失了,帮我处理他的脚本

标签 javascript svg zooming raphael

我所说的扩展是Raphael-zpd:http://pohjoisespoo.net84.net/src/raphael-zpd.js

/* 编辑 使用以下命令将脚本添加到 Raphael 文档 var zpd = new RaphaelZPD(paper, { Zoom: true, pan: true, Drag: false}); 其中 paper 是你的 Canvas */

该脚本最初发布于作者 github http://www.github.com/somnidea已不复存在。

我想做的是在拉斐尔加载后立即运行鼠标滚轮缩小到阈值。 Zoomthreshold 在脚本 zoomThreshold: [-37, 20] 的开头设置。在鼠标滚轮滚动函数中,它与默认情况下为 0 的 ZoomCurrent 进行比较 me.zoomCurrent = 0;

这是整个鼠标滚轮事件部分

me.handleMouseWheel = function(evt) {
    if (!me.opts.zoom) return;

    if (evt.preventDefault)
        evt.preventDefault();

    evt.returnValue = false;

    var svgDoc = evt.target.ownerDocument;

    var delta;

    if (evt.wheelDelta)
        delta = evt.wheelDelta / 3600; // Chrome/Safari
    else
        delta = evt.detail / -90; // Mozilla

    if (delta > 0) {
        if (me.opts.zoomThreshold) 
            if (me.opts.zoomThreshold[1] <= me.zoomCurrent) return;
        me.zoomCurrent++;
    } else {
        if (me.opts.zoomThreshold)
            if (me.opts.zoomThreshold[0] >= me.zoomCurrent) return;
        me.zoomCurrent--;
    }

    var z = 1 + delta; // Zoom factor: 0.9/1.1

    var g = svgDoc.getElementById("viewport"+me.id);

    var p = me.getEventPoint(evt);

    p = p.matrixTransform(g.getCTM().inverse());

    // Compute new scale matrix in current mouse position
    var k = me.root.createSVGMatrix().translate(p.x, p.y).scale(z).translate(-p.x, -p.y);
    me.setCTM(g, g.getCTM().multiply(k));

    if (!me.stateTf)
        me.stateTf = g.getCTM().inverse();

    me.stateTf = me.stateTf.multiply(k.inverse());
}

我不能一开始就绘制较小的 SVG 的原因是我使用光栅图像作为背景并且需要它们具有更高分辨率。我仍然想从我在阈值处设置的最远点开始。我是否有可能以某种方式使用这个脚本来做到这一点?我自然会使用它来处理鼠标缩放/平移。

//编辑

脚本末尾也有这个函数,但到目前为止我还无法使用它。

Raphael.fn.ZPDPanTo = function(x, y) {
var me = this;

if (me.gelem.getCTM() == null) {
    alert('failed');
    return null;
}

var stateTf = me.gelem.getCTM().inverse();

var svg = document.getElementsByTagName("svg")[0];

if (!svg.createSVGPoint) alert("no svg");        

var p = svg.createSVGPoint();

p.x = x; 
p.y = y;

p = p.matrixTransform(stateTf);

var element = me.gelem;
var matrix = stateTf.inverse().translate(p.x, p.y);

var s = "matrix(" + matrix.a + "," + matrix.b + "," + matrix.c + "," + matrix.d + "," + matrix.e + "," + matrix.f + ")";

element.setAttribute("transform", s);

return me;


}

似乎它用于通过单击事件平移文档,以便单击可以使用给定的坐标执行该函数。然而,正如我所说,我一直无法工作。我不知道它应该如何运作。我尝试了 paper.ZPDPanTo(100, 100); 以及 ZPDPanTo(100,100) 但没有任何反应。

最佳答案

您可能还想查看 Raphaël 2.0 的工作分支,据说它增加了对 viewBox 和转换的支持,请参阅 https://github.com/DmitryBaranovskiy/raphael/tree/2.0 .

这并不能完全回答您的问题,但 Raphaël 2.0 似乎很可能会解决您的用例。

如果您使用纯 svg,则可以通过 SVG DOM 属性 currentTranslatecurrentScale 操作缩放和平移位置,请参阅 this example .

关于javascript - 这个 Raphael JS 扩展的作者已经从互联网上消失了,帮我处理他的脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7159305/

相关文章:

iphone - 使用 IBAction 放大/缩小 UIWebView 中的文本

javascript - 下拉列表中的 Angular 数据未第二次设置

javascript - yui imagecropper 出现在图像下方?

javascript - 带有垂直滚动条的Extjs hbox

javascript - 当光标位于内部 svg 元素上时,d3-zoom 中断

html - 如何使用SVG在圆中绘制直角弧?

javascript - svg 对象模式,如何将它相乘

javascript - 将文档中的单词数组及其坐标转换为句子

delphi - Delphi中ListView上的半透明层?

javascript - D3 选择性变焦