在 famo.us 中,有一些简单的方法可以在表面上使用修改器来执行动画/交互。例如,拖动和动画表面在 famo.us 指南中有非常简单的示例。
...assume require('') statements above here...
var mainContext = Engine.createContext();
var draggable = new Draggable({...});
var surface = new Surface({...});
var transitionableTransform = new TransitionableTransform();
var modifier = new Modifier({
origin: [.5, .5],
transform: transitionableTransform
});
surface.pipe(draggable);
surface.on('click', function () {
transitionableTransform.setScale([3, 3, 1], {duration: 300});
});
mainContext.add(draggable).add(surface);
但是,在更复杂的场景中,您可能希望协调多个动画,根据交互的需要开始/停止/反转。在这些情况下,像添加带有持续时间的变换这样简单的事情最初可能会起作用,但不能保证用户与它们交互的次数越多就不会失去同步。
#render 方法似乎是放置某些类型的协调动画的常见位置。我对它的有限理解是它识别正在渲染的节点的“规格”,并在渲染循环的每一帧上调用。因此,您可能能够识别特定动画的每个步骤,然后根据它的交互方式能够停止中间动画并根据需要进行更改。例如,Flipper 似乎就是这样工作的
(src/views/Flipper.js):
Flipper.prototype.render = function render() {
var pos = this.state.get(); //state is a transitionable
var axis = this.options.direction;
var frontRotation = [0, 0, 0];
var backRotation = [0, 0, 0];
frontRotation[axis] = Math.PI * pos;
backRotation[axis] = Math.PI * (pos + 1);
if (this.options.cull && !this.state.isActive()) {
if (pos) return this.backNode.render();
else return this.frontNode.render();
}
else {
return [
{
transform: Transform.rotate.apply(null, frontRotation),
target: this.frontNode.render()
},
{
transform: Transform.rotate.apply(null, backRotation),
target: this.backNode.render()
}
];
}
};
有没有关于#render 在制作动画时应该扮演的角色的文档?或者渲染方法应该如何工作(例如,构造返回的规范的正确方法)。渲染是否应该更底层,如果是这样,是否应该使用不同的构造?