9

我看到 famo.us 的 示例主要引用 Modifier 类,但是 famo.us 大学教程主要引用 StateModifier 类。

这两者有何不同,哪一个是最合适的应用程序?

4

4 回答 4

3

目前,这些没有区别。

如果需要、和,请使用StateModifier。目前Modifier仍然支持这些方法,但它们已被弃用setTransformsetSizesetOriginsetOpacity

StateModifier使用Transitionable,可用于在值之间平滑转换使用这些方法时只需提供一个过渡:

stateModifier.setTransform(Transform.rotateZ(Math.random()*Math.PI/2), { curve: 'easeOut', duration: 5000 });

修饰符更受限制,使用transformFrom、和。这些方法可以接收一个值、getter 函数或一个带有函数的对象。sizeFromoriginFromopacityFromget

于 2014-04-16T10:25:29.157 回答
3

根据著名大学的说法,这些是不同之处:
Statemodifiers 为每个实例创建一个新的 Transitionable,这意味着您不能重用给定的 transitionable。使用修饰符,您可以:
- 跨组件共享状态/相互派生状态

http://famo.us/university/ Famous-102/transitionables/6/

于 2014-07-24T18:26:35.683 回答
2

他们的构造函数选项有一个重要的区别。StateModifier 只接受常量值作为初始值。修饰符接受常量值和具有适当返回值的函数。该函数将以 60fps 进行评估。

1) 状态修饰符

var stateModifier = new StateModifier({
    size: [200, 200],
    opacity: 1,
    transform: [1, 0.5, 0, 0, -0.5, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],
    //transform: Transform.translate(20, 20, 0),  // --> this is still constant
});

2) 修饰符

var transitionable = new Transitionable(0);
transitionable.set(2*3.14, {duration: 2000});

var modifier = new Modifier({
    origin: [0.5, 0.5],
    transform: function(){
        var state = transitionable.get();
        transition = Transform.rotateZ(state);
        return transition;  // --> this will cause rotating 
    },
    opacity: function(){
        return Math.random();  // --> this will cause blinking (60fps)  
    },
});
于 2014-08-09T13:26:35.427 回答
2

您选择的任何一个都需要考虑性能和设计。

当您的对象具有静态定位或不经常更改其变换细节时,您可以使用修改器。例如,如果您有一组相对于父对象坐下的对象,并且您只需要设置它们的位置一次。您使用修改器是因为一旦您将它们布置好,就无需担心触及它们所关心的渲染树。

当您需要更频繁地控制对象的变换时,您可以使用StateModifier 。这是当您想要动画或控制每帧或事件发生时的变换时。

使用StateModifier的方法。这为您提供了两种更改/动画对象变换的方法。取意味着您正在提供一个函数并使用某个对象来确定该对象的值(例如一个或您自己的带有方法的对象)。如果您有一个始终跟踪其他东西的游戏对象,这可能会很有用,您将使用一个函数,该函数在每一帧都要求对象变换值。Push意味着你决定何时改变事物,并使用Transitionable.get().setOpacity.setTransformStateModifier. 这将更适合在某些事件触发之前保持静止的 UI 对象。您还可以在调用这些方法时使用不同的缓动曲线,或者让更改立即发生。

性能和设计考虑来自这样一个事实,即您应该始终尝试编写一个不必做超过它需要做的事情的应用程序。如果您的所有对象都使用StateModifier带有*pull模型的 a(使用每个帧调用的函数),您可以想象这将花费更多的 CPU 资源,而不是您只需要偶尔更改一个对象并使用push方法来更改需要时的对象状态。这对于小型 UI 可能不是问题,但如果您将应用程序扩大到控制数百个甚至数千个对象,您可以看到您开始消耗更多 CPU 功率的地方。

所以总而言之,Modifer非常适合将东西放在某个地方并忘记它,而StateModifier更适合能够移动东西,但你必须在不断被问到它在做什么()或在你准备好时告诉它之间做出选择()。

于 2015-01-19T01:07:25.417 回答