在上一篇《基於HT for Web矢量實現3D葉輪旋轉》一文中,我略微提了下HT for Web基礎動畫的相關用法,可是講得不深刻,今天就來和你們分享下HT for Web基礎動畫的相關介紹及用法。php
先上一段枯燥的理論知識,你們混個眼熟。html
在HT的數據模型驅動圖形組件的設計架構下,動畫可理解爲將某些屬性由起始值逐漸變到目標值的過程, HT提供了ht.Default.startAnim的動畫函數,其示例代碼以下。node
ht.Default.startAnim({ frames: 12, // 動畫幀數 interval: 10, // 動畫幀間隔毫秒數 easing: function(t){ return t * t; }, // 動畫緩動函數,默認採用`ht.Default.animEasing` finishFunc: function(){ console.log('Done!') }, // 動畫結束後調用的函數。 action: function(v, t){ // action函數必須提供,實現動畫過程當中的屬性變化。 node.setPosition( // 此例子展現將節點`node`從位置`p1`動畫到位置`p2`。 p1.x + (p2.x - p1.x) * v, p1.y + (p2.y - p1.y) * v ); } });
ht.Default.startAnim支持Frame-Based和Time-Based兩種方式的動畫,以上代碼爲Frame-Based方式, 這種方式用戶經過指定frames動畫幀數,以及interval動畫幀間隔參數控制動畫效果。瀏覽器
如下代碼爲Time-Based方式,該方式用戶只須要指定duration的動畫週期的毫秒數便可,HT將在指定的時間週期內完成動畫, 不一樣於Frame-Based方式有明確固定的幀數,即action函數被調用多少次,Time-Based方式幀數或action函數被調用次數取決於系統環境, 通常來講系統配置更好的機器,更高效的瀏覽器則調用幀數越多,動畫過程更平滑。因爲js語言沒法精確控制interval時間間隔, 採用Frame-Based不能精確控制動畫時間週期,即便相同的frames和interval參數在不一樣的環境,可能會出現動畫週期差別較大的問題, 所以HT默認採用Time-Based的方式,若是不設置duration和frames參數,則duration參數將被系統自動設置爲ht.Default.animDuration值。架構
ht.Default.startAnim({ duration: 500, // 動畫週期毫秒數,默認採用`ht.Default.animDuration` action: function(v, t){ ... } });
startAnim函數會返回一個anim對象,可調用anim.stop(true)終止動畫,其中的參數shouldBeFinished表明是否徹底未達到的目標改變, 若是爲true則會調用anim.action(anim.easing(1))。同時anim還具備anim.pause()和anim.resume()可中斷和繼續動畫功能, 以及anim.isRunning()函數判斷動畫是否正在進行。app
action函數的第一個參數v表明經過easing(t)函數運算後的值,t表明當前動畫進行的進度[0~1],通常屬性變化根據v參數進行。函數
ht.Default.startAnim中得easing參數是用於讓用戶定義函數,經過數學公式控制動畫, 如勻速變化、先慢後快等效果,可參考http://easings.net/動畫
介紹就到這裏,接下來咱們來作一個簡單的例子,先練練手,具體的頁面效果以下:spa
沒錯。它就是一個球,咱們要作的就是點擊瀏覽器的某個位置,而後它平滑地滑到點擊位置,點擊自身的話,就作旋轉收縮,而後再旋轉還原,整個過程都是經過HT for Web的基礎動畫來完成的。.net
建立拓撲及建立節點的代碼我再這裏就很少囉嗦了,咱們直接上基礎動畫的內容:
首先咱們須要在拓撲上監聽點擊事件,由於咱們的Demo涉及到兩個動畫,因此在點擊事件的內部處理須要作些簡單的判斷,咱們先來看下監聽改如何添加:
var type = "ontouchend" in document ? 'touchstart' : 'mousedown'; view.addEventListener(type, function(e){ e.preventDefault(); … }, false);