# GreenSock中的TweenMax
###### tags: greenSock tags:tweenMax
>自己寫一些常用到的,方便日後查詢
### **介紹**
greenSock 是功能強大的JS動畫涵式庫,官網上有詳細的[API說明](http://greensock.com/docs/#/HTML5/GSAP/),此篇先介紹[TweenMax](https://www.tweenmax.com.cn/)的補間動畫使用。
---
### **TweenMax()**
用來建構TweenMax的函數,可實例化作使用,也可存於變數中使用。
TweenMax(目標, 作用秒數, 作用屬性), 若是使用TweenLite就是TweenLite()。
```
let TweenTarget = new TweenMax( target:Object, duration:Number, vars:Object )
let TweenTarget2 = new TweenLite( target:Object, duration:Number, vars:Object )
```
### **作用屬性,參數部分介紹**
* delay: '延遲時間(s),在此動畫應該開始前計算delay秒數',
* ease: '動畫運行曲線',
* repeat: '重複的次數,不包含第一次',
* yoyo: '(T/F)動畫再重複時,是否會來回執行,而不是從頭開始',
* yoyoEase: '設定repeat,從尾到頭時,動畫的運行曲線,同上 ease屬性',
* paused: '(T/F)為ture,對象在create後就會停止',
* overwrite: '要不要發生覆寫這件事,如果是“none”就是不發生、”all“就是發生'
* onComplete(function): '當動畫結束時,會執行的函式'
* onCompleteParams(Array): '帶入onComplete的參數,用'{self}'可拿到本身 tween實例'
* lazy: '預設true,這是為了解決效能的問題,預設會先讀完所有的動畫後再執行' 參考:https://www.youtube.com/embed/TMHJptqnDpU?vq=hd720
---
### **作用屬性給予動畫事件**
基本上除了本身事件外,也能傳入數組,設定作用範圍
on__: 作用事件, on___Params: Array 傳遞給on__的參數數組, on___Scope:obj 定義給on___的作用區
* onComplete: 動畫完成結束後回調此函數
* onReverseComplete: 動畫完成後回調慘函數且反向撥放
* onStart: 動畫開始渲染時作用事件
* onUpdate: 動畫發生改變時(每一針)不停觸發
* onOverwrite: fun(被覆蓋的動畫, 覆蓋的動畫, 目標, 屬性數組)
* onRepeat: 動畫每次重複執行時, 執行此事件
* .eventCallback(type: string, callBack: function(), params:[], scope:) 獲取或設定事件(上方所有事件皆可使用), 和傳給此函數的參數
---
### 基本動畫結構 TweenMax.__ (與TweenLite通用)
TweenMax.動作(目標: object,秒數: number,作用屬性: object)
* to: 到目標位置
```
TweenMax.to(target, 0.5, { x: 0 });
// 多個屬性可設為:
TweenMax.to([target1, target2], 1, { x: 0 });
```
* form: 從目標位置而來, 就是動畫設置開始點
* formTo: 設置動畫起始點和結束點
```
TweenMax.form(target, 0.5, { x: 0 });
// formTo(...{起點}, {終點})
TweenMax.formTo(target, 0.5, { x: 0 }, { x: 900 });
```
* set: 設置該目標的屬性不用給予時間(可用於不想改變位置但想改變外貌..等等)
```
TweenMax.set(target,{ rotation:360 });
// 相當於0秒的動畫
TweenMax.to(target, 0, { rotation:360 });
```
官方文件上有介紹使用set做出3D效果, 但在egret上似乎實現不了, 有興趣者可上去看看[使用](https://www.tweenmax.com.cn/api/tweenmax/TweenMax.set())。
* stagger: 可設定一個有間隔的動畫數列,等同於多個TweenMax(TweenMax才能使用)
同樣能使用To/From
```
** TweenMax.staggerTo/Form(目標, 時間, {起點}, 間隔數值, 完成後函數, 傳入回傳函數數組, 函數作用範圍) */
TweenMax.staggerTo([target1,target2,target3], 2, { rotation: 360, x: 902, y: 315, scaleX: 0.5, scaleY: 0.5 }, 0.1);
```
* staggerFormTo:設定序列動畫的起點與終點 :
能使用cycle屬性。
cycle(obj): 可自訂使用不同的屬性組, 也可使用function. 亂數..等等, 亦可使用上方的staggerTo/Form..等
```
var objects = [obj1, obj2, obj3, obj4, obj5];
TweenMax.staggerFromTo(objects, 作用時間, {起點屬性}, {終點屬性}, 0.2);
// cycle: 通過function返回屬性數組
TweenMax.staggerFromTo(objects, 1, {cycle:{屬性}}, {終點屬性}, 0.2);
```
* delayedCall: 設定時間(幀數)後調用函數的方法
```
/** TweenMax.delayedCall(延遲秒數, 執行函數, 回傳參數[], scope作用區域, 延遲為秒數還是幀數:預設false為 秒)
TweenMax.delayedCall(4, Back)
function Back() { TweenMax.staggerTo(target[], 1, {屬性}, 0.4) };
```
---
### 播放組件
播放組件基本上為:
function(秒數/狀態, 是否保持默認值屬性,若是true在作用期間內會停止函數操作、事件等)
* 播放: play(於第幾秒時間點播放, ..)
* 暫停: pause(跳轉到第幾秒並停止,..)
```
開關 ? TweenMaxTarget.play() : TweenMaxTarget.pause();
```
* 暫停狀態: paused(給予暫停狀態: boolean)
```
// TweenMaxTarget.paused(false / true) 亦可達到簡單的播放和暫停
開關 ? TweenMaxTarget.paused(true) : TweenMaxTarget.paused(false);
```
* 重新開始: restart(是否重新開始, ..)
給予true會略過delay屬性
```
option ? TweenMaxTarget.restart() : TweenMaxTarget.restart(true);
```
* 繼續: resume(第幾秒繼續)
```
TweenMaxTarget.pause() // 暫停
TweenMaxTarget.resume() // 繼續
TweenMaxTarget.resume(3) // 於3秒時繼續開始
```
* 倒轉播放: reverse(第幾秒反轉撥放, ..)
所有動畫皆會反轉, ease曲線也是EX: easeIn -> easeOut
reverse(0) 在動畫最後反方向撥放 reverse(-1) 倒數1秒反方向撥放
```
TweenMaxTarget.reverse()
```
* 倒轉播放狀態: reversed()
和前者paused()一樣, 可以取得倒轉狀態,設置(true)為反方向
```
// 正常播放與反方向播放
開關 ? TweenMaxTarget.play() : TweenMaxTarget.reversed( !TweenMaxTarget.reversed(); );
```
* 直接跳轉到某時間點: seek(跳轉目標秒數,是否阻止事件或回調函數)
不改變狀態(播放/暫停/方向)的形況下直接跳轉到某時間點
阻止事件預設為true。
```
TweenMaxTarget.seek(3) // 直接跳到3秒
TweenMaxTarget.seek(3,false) // 直接跳到3秒, 且不阻止期間內的函數與事件
```
* 設定速率: timeScale(速率:number)
設定動畫播放速度, 默認為1
和egret中的timeScale一模模一樣樣
```
TweenMaxTarget.timeScale(3) // 3倍速
TweenMaxTarget.timeScale(0.5) // 0.5倍速
```
---
### **動畫屬性調整(無入參時為獲取)**
* .duration( value:Number ) 單次動畫持續的時間
* .totalDuration( value:Number ) 全部重複動畫加重複間隔的持續時間
* .time( value:Number ) 當前動畫已用時間
* .totalTime( time:Number, suppressEvents:Boolean ) 全部重複動畫加重複間隔的總時間
* .progress( value:Number, suppressEvents:Boolean ) 進程0~1
* .totalProgress( value:Number, suppressEvents:Boolean ) 總進程0~1
* .delay( value:Number )獲取或者設置動畫的開始延遲秒數
* .invalidate() 刷新開始/結束值,此時如再restart()會以當前位置作為新的開始點
* .isActive() 判斷是否在播放中
* .startTime( value:Number ) / .endTime( value:Number )
* .repeat( value:Number ) 第一次完成後的重複次數
* .repeatDelay( value:Number )
* .yoyo( value:Boolean )獲取或設置補間動畫的yoyo的狀態。
---
### **實例屬性(除data和ticker外均僅用於獲取數據)**
* data 用於儲存信息
myTween.data={data1:'value1',data2:'value2',} //存取
myTween.data.data1 // 獲得value1
* target 動畫對象
* timeline 父級時間軸對象
* vars 構造器配置對象
* ticker 每當引擎update時這個對象將分配tick事件
[官方文件上有詳細介紹](https://www.tweenmax.com.cn/api/tweenmax/TweenMax.ticker)記得打開F12
---
### **實例方法**
* TweenMax.getTweensOf( target:Object, onlyActive:Boolean )獲取目標上所有動畫對象的數組
* TweenMax.getAllTweens( includeTimelines:Boolean ) 獲取所有動畫實例的數組
* .kill( vars:Object, target:Object ) 消滅整個動畫或部分參數。
```
//刪除動畫
myAnimation.kill();
//刪除動畫的x和y屬性
myAnimation.kill({x:true, y:true});
//刪除對象"myObject"上的動畫,如果動畫有多個對象,其他對像上的動畫不會刪除
myAnimation.kill(null, myObject);
//僅刪除對象"myObject"的動畫的x和y屬性
myAnimation.kill({x:true, y:true}, myObject);
//僅刪除對象"myObject1"和"myObject2"對象的"opacity"屬性
myAnimation.kill({opacity:true}, [myObject1, myObject2]);
```
* TweenMax.killDelayedCallsTo( function:Function ) 移除延遲函數
* TweenMax.killTweensOf( target:Object, vars:Object ) 移除目標所有動畫
* TweenMax.killAll(complete, tweens, delayedCalls, timelines) 全部刪除
* TweenMax.killChildTweensOf( parent:Object, complete:Boolean )刪除目標子元素動畫
* TweenMax.globalTimeScale( value:Number ) 讀取或設置所有動畫全局播放速率
* TweenMax.pauseAll( tweens, delayedCalls, timelines ) 全部暫停
* TweenMax.resumeAll( tweens, delayedCalls, timelines )全部恢復