Raphael JS不单独旋转组/组

时间:2013-08-27 07:49:01

标签: svg raphael

我一直在玩Raphael JS,但未能找到任何解决方案来将一组/一组路径作为组轮换,而不是单独进行。

一组/一组路径:

A group/set of path

每个元素都会旋转。不是整个组/集:

When group/set is rotated

我的工作方式:

var bobble = map.paper.set();

bobble.push(map.paper.add([{
    "fill":fill,
    "stroke":"none",
    x: 50,
    y: 50,
    width: 100,
    height: 100,
    "type":"rect",
    "r": 4
},{
    "fill":fill,
    "stroke":"none",
    x: 100,
    y: 25,
    width: 200,
    height: 50,
    "type":"rect",
    "r": 4
}]));

bobble.rotate(45);

我做错了什么?

3 个答案:

答案 0 :(得分:5)

您可以转到 DEMO

var paper = Raphael('arrows');

var r1 = paper.rect(100,100,200,10,5).attr({fill:'white'});
var r2 = paper.rect(50,200,100,15,5).attr({fill:'white'});

var st = paper.set(r1,r2);

var l_coord = st.getBBox().x,
    r_coord = st.getBBox().x2,
    t_coord = st.getBBox().y,
    b_coord = st.getBBox().y2;

var cx = (l_coord + r_coord)/2,
    cy = (t_coord + b_coord)/2;

st.rotate(54,cx,cy);

enter image description here enter image description here

由于您需要获取Raphael set's中心坐标,因此可以使用getBBox()函数返回:

enter image description here

答案 1 :(得分:1)

raphaeljs集是一个元素列表。因此,当您使用tranform方法时,它只是集合中列表的唯一元素的变换。

我创建了一个插件,支持我项目的 g 标记。但我还没有实现转换方法。

const SVG = 'http://www.w3.org/2000/svg';
function TCRaphael(container, width, height) {
    var paper = new Raphael(container, width, height);
    paper.node = document.getElementById(container).getElementsByTagName("svg")[0];
    console.log(paper.node)
    paper.group = function (parent) {
        return new Group(parent);
    };

    function Group(parent) {
        var me = this;
        this.node = document.createElementNS(SVG, "g");
        if (typeof parent !== 'undefined') {
            if (typeof parent.node != 'undefined')
                parent.node.appendChild(me.node);
            else{
                parent.appendChild(me.node);
            }
        }

        this.append = function (child) {
            me.node.appendChild(child.node);
            return child;
        };

        this.appendNode = function (childNode) {
            me.node.appendChild(childNode);
        };

        this.appendTo = function (parent) {
            if (typeof parent !== 'undefined') {
                if (typeof parent.node != 'undefined')
                    parent.node.appendChild(me.node);
                else{
                    parent.appendChild(me.node);
                }
            }
        };

        this.remove = function(){
            me.node.parentNode.remove();
        };

        this.circle = function(x, y, r){
            return me.append(paper.circle(x, y, r));
        };

        this.ellipse =function(x, y, rx, ry){
            return me.append(paper.ellipse(x, y, rx, ry));
        };

        this.image = function(src, x, y, width, height){
            return me.append(paper.image(src, x, y, width, height));
        };

        this.path = function(pathString){
            return me.append(paper.path(pathString));
        };

        this.rect = function(x, y, width, height, r){
            return me.append(paper.rect(x, y, width, height, r));
        };

        this.text = function(x, y, text){
            return me.append(paper.text(x, y, text));
        }


    }
    return paper;
}

您可以添加更多您想要的功能TCRaphael。

答案 2 :(得分:1)

我觉得这样容易一点。

myset.transform("R45,20,20")

完全相同
myset.rotate(45,20,20)  // deprecated

整个 myset 将围绕中心旋转20,20(可能是该组的中心) 否则

myset.transform("R45")

将围绕它自己的中心旋转集合的每个元素