2013-02-21 75 views

回答

2

正如你已经发现,应用变换到拉斐尔对象不改变它的位置属性。

查看transform method中的省略号语法。因为转换非常头疼,所以我更喜欢在简单情况下直接改变属性。您只需记住使用.data()方法存储任意数据的dragStart函数的起始位置。

var paper = Raphael(0, 0, 320, 320); 
var innerC = paper.circle(320/2, 320/2, 20); 
innerC.attr("stroke", "#000"); 
innerC.attr("fill", "#000"); 


var dragMove = function (dx, dy, x, y, e) { 
    console.log(innerC.attr('cx')); 
    this.attr("cx", this.data("ox") + dx); 
    this.attr("cy", this.data("oy") + dy); 
    this.animate({ 
     "fill-opacity": 1 
    }, 500); 
}, 
dragStart = function (x, y) { 
    this.data("ox", this.attr("cx")); 
    this.data("oy", this.attr("cy")); 
}, 

dragEnd = function() { 
    this.animate({ 
     "fill-opacity": 1 
    }, 500); 
}; 

innerC.drag(dragMove, dragStart, dragEnd); 

jsFiddle

+0

工作就像一个魅力!谢谢。 – JavaCake 2013-02-21 21:19:15

+0

如果我尝试点击不完全位于中间的圆圈,它往往会反弹到中心点的距离。你知道这是为什么发生吗? – JavaCake 2013-02-21 22:25:43

+0

啊,是的,你应该这样做:this.data(“ox”,this.attr(“cx”)),同样适用于y – 2013-02-21 23:13:08