我看到famo.us examples大部分指的是修飾符類,但是famo.us大學教程主要引用了StateModifier類。famo.us中的Modifier和StateModifier有什麼區別?
這兩者如何不同以及哪個是最合適的應用程序?
我看到famo.us examples大部分指的是修飾符類,但是famo.us大學教程主要引用了StateModifier類。famo.us中的Modifier和StateModifier有什麼區別?
這兩者如何不同以及哪個是最合適的應用程序?
目前,這些沒有什麼區別。
使用StateModifier如果你需要setTransform
,setSize
,setOrigin
和setOpacity
。 目前修改器仍然支持這些方法,但它們是已棄用。
的StateModifier使用可轉換,其可以被用於將值之間平滑過渡。只要使用這些方法時提供一個過渡:
stateModifier.setTransform(Transform.rotateZ(Math.random()*Math.PI/2), { curve: 'easeOut', duration: 5000 });
的修改較爲有限,並且使用transformFrom
,sizeFrom
,originFrom
和opacityFrom
。這些方法可以接受一個值,getter函數或帶有get
函數的對象。
根據着名大學,這些是不同之處:
Statemodifiers爲每個實例創建一個新的Transitionable,這意味着您不能重用給定的可轉換對象。 使用修改器,你可以:
- 跨組件共享狀態/導出彼此
狀態有一個在他們的建設者的選擇的一個重要區別。 StateModifier只接受常量值作爲初始值。修飾符接受具有適當返回值的常量值和函數。該功能將以60fps的速度播放。
1)StateModifier
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)
},
});
有性能和設計方面的考慮在你選擇的任何。
當對象具有靜態定位或不經常更改其變形細節時,您可以使用修改器。例如,如果您有一組相對於父對象坐的對象,並且您只需要設置其位置一次。你使用了一個Modifier,因爲一旦你放下了它們,就不用擔心觸摸他們所關心的渲染樹。
當您需要更頻繁地控制對象轉換時,您可以使用StateModifier。這是當你想要動畫或控制每一幀的變換,或者每當事件發生時。
的StateModifier
使用任一拉或推方法。這給你兩種方法來改變/動畫化對象變換。 拉意味着您正在提供一個函數並使用某個對象來確定對象的值(如使用.get()
方法的Transitionable
或您自己的對象)。如果你有一個總是追蹤別的東西的遊戲對象,這可能很有用,你可以使用一個函數,它會在每一幀都要求對象變換值。 推送表示您決定何時更改內容,並使用StateModifier
的.setOpacity
或.setTransform
方法。這樣可以更好地適應在某些事件觸發前保持靜止的UI對象。每當您調用這些方法時您還可以使用不同的緩動曲線,或者只需立即進行更改。
性能和設計考慮因素來自這樣一個事實,即您應該總是嘗試編寫一個應用程序,該應用程序不必超出需要的範圍。如果所有對象都使用StateModifier
和*拉模型(使用稱爲每幀的函數),那麼可以想象,如果偶爾需要更改對象並且使用了推方法在需要時更改對象狀態。這對於一個小型用戶界面來說可能不是問題,但是如果您將應用擴展到控制數百甚至數千個對象,則可以看到開始耗費更多CPU資源的位置。
所以,改性劑只是放置東西的地方,並忘掉它,那裏的StateModifier是能夠移動的東西更好的是偉大的,但你必須與不斷被詢問它在做什麼選擇(拉)或告訴它,當你準備好(推)。
那麼爲什麼任何人都會使用'Modifier'呢? –
當您想要基於(連續)功能而不是事件進行修改時。示例:使用StateModifier在按鍵上更改大小,但使用「修改器」根據鼠標位置更改顏色。這將更新Famous與引擎(60 FPS)關聯起來,而不是DOM事件,這可以提高性能(如果事件確實是連續的) – markmarijnissen
我剛剛也瞭解到這一點。命名非常混亂。他們應該爲兩者使用一個單獨的類「Modifier」,並有一個獨立的函數,比如'bindTransform()'或類似的東西... –