对象可以是简单的,矩形或圆形。但路径应该是贝塞尔曲线。如果不太麻烦,请提供 javascript/ Raphael代码。
如果在动画过程中有移动物体的拖尾效果会很好。
对象可以是简单的,矩形或圆形。但路径应该是贝塞尔曲线。如果不太麻烦,请提供 javascript/ Raphael代码。
如果在动画过程中有移动物体的拖尾效果会很好。
以防万一您尝试将其与 RaphaelJS 2 一起使用(animateAlong 不再存在),您可以在这里看到一个可能的解决方案:http: //jsfiddle.net/gyeSf/17/。
编辑:这里还有另一个例子:http ://raphaeljs.com/gear.html
只需使用.animateAlong()
方法。
它需要 4 个参数:
基本上来自文档:
window.onload = function() {
var r = Raphael("canvas", 200, 200),
p = r.path("M10,50C10,100,90,0,90,50C90,100,10,0,10,50Z")
.attr({stroke: "#ddd"}),
e = r.ellipse(10, 50, 4, 4).attr({stroke: "none", fill: "#f00"});
r.rect(0, 0, 200, 200).attr({stroke: "none", fill: "#000", opacity: 0})
.click(function () {
e.attr({rx: 5, ry: 3})
.animateAlong(p, 4000, true, function () { // Animate along path
e.attr({rx: 4, ry: 4});
});
});
};
这里有一个很好的解决方案。
我复制了下面的代码:
/*
You can copy and paste the below into your codebase somewhere.
As long as Raphael is a global object, it'll just work.
USAGE (same default values for optional parameters as Raphaël's "animate" method)
=====
element.animateAlong({
path: REQUIRED - Path data string or path element,
rotate: OPTIONAL - Boolean whether to rotate element with the direction it is moving
(this is a beta feature - currently kills existing transformations
and rotation may not be perfect),
duration: OPTIONAL - Number in milliseconds,
easing: OPTIONAL - String (see Raphaël's docs),
debug: OPTIONAL - Boolean, when set to true, paints the animating path, which is
helpful if it isn't already rendered to the screen
},
props - Object literal containing other properties to animate,
callback - Function where the "this" object refers to the element itself
);
EXAMPLE
=======
var rect = paper.rect(0,0,50,50);
rect.animateAlong({
path: "M0,0L100,100",
rotate: true,
duration: 5000,
easing: 'ease-out',
debug: true
},
{
transform: 's0.25',
opacity: 0
},
function() {
alert("Our opacity is now:" + this.attr('opacity'));
});
*/
Raphael.el.animateAlong = function(params, props, callback) {
var element = this,
paper = element.paper,
path = params.path,
rotate = params.rotate,
duration = params.duration,
easing = params.easing,
debug = params.debug,
isElem = typeof path !== 'string';
element.path =
isElem
? path
: paper.path(path);
element.pathLen = element.path.getTotalLength();
element.rotateWith = rotate;
element.path.attr({
stroke: debug ? 'red' : isElem ? path.attr('stroke') : 'rgba(0,0,0,0)',
'stroke-width': debug ? 2 : isElem ? path.attr('stroke-width') : 0
});
paper.customAttributes.along = function(v) {
var point = this.path.getPointAtLength(v * this.pathLen),
attrs = {
x: point.x,
y: point.y
};
this.rotateWith && (attrs.transform = 'r'+point.alpha);
// TODO: rotate along a path while also not messing
// up existing transformations
return attrs;
};
if(props instanceof Function) {
callback = props;
props = null;
}
if(!props) {
props = {
along: 1
};
} else {
props.along = 1;
}
var startAlong = element.attr('along') || 0;
element.attr({along: startAlong}).animate(props, duration, easing, function() {
!isElem && element.path.remove();
callback && callback.call(element);
});
};
使用 Raphaёl 方法似乎无法做到这一点animate()
(因为它会线性地更改对象属性)。
我会为您提供一个根据贝塞尔曲线公式每毫秒左右更改对象位置的函数。使用 Raphaёltranslate()
方法和 JavaScript 计时器。