Ok,接着上一篇从TweenCore构造函数中返回后,就来到了TweenLite自身的构造函数中:
| TweenLite的构造函数 | [复制代码] |
- this.target = target;
- if (this.target is TweenCore && "timeScale" in this.vars) {
- this.cachedTimeScale = 1;
- }
- propTweenLookup = {};
- _ease = defaultEase;
- _overwrite = (!("overwrite" in vars) || (!overwriteManager.enabled && vars.overwrite > 1)) ? overwriteManager.mode : int(vars.overwrite);
- var a:Array = masterList[target];
- if (!a) {
- masterList[target] = [this];
- } else {
- if (_overwrite == 1) {
- for each (var sibling:TweenLite in a) {
- if (!sibling.gc) {
- sibling.setEnabled(false, false);
- }
- }
- masterList[target] = [this];
- } else {
- a[a.length] = this;
- }
- }
- if (this.active || this.vars.immediateRender) {
- renderTime(0, false, true);
- }
这个过程中完成的操作有如下部分:
1 记录被TweenLite操作的target。
2 创建propTweenLookup对象,在后面会具体说明这个对象用于根据操作的属性,查找到实际操作这个属性的PropTween对象,例如查找操作MovieClip对象x属性的PropTween,这样便于实现TweenLite.killVars方法。解释一下这个方法的作用:一个TweenLite对象可以同时对对象的多个属性执行Tween,例如同时让MovieClip的x和y都增大,但是如果用户在Tween的过程中不想让TweenLite再改变MovieClip的x属性,但同时又要保留这个TweenLite对象继续增加y,那么就可以通过killVars取消操作某个属性。
3 设置TweenLite对象的默认ease。ease的作用是控制Tween过程是加速还是减速,或者实现弹性等效果,默认的ease是匀减速的。
4 设置TweenLite对象的_overwrite模式,也就是设定当前TweenLite如何处理与其它也作用在同一个target上的TweenLite或者TweenMax之间的关系。参见OverwriteManager的说明,有6中模式,这里先说明_overwrite=1的情况,其它的到OverwriteManager中说明。在TweenLite的构造函数设置完_overwrite之后,会从masterList中检查是否已经有作用在target上的其它TweenLite,如果没有那么当前创建的TweenLite就是第一个,就记录到masterList中;如果检测到有其它TweenLite,并且当前创建的TweenLite的_overwrite=1的时候,就禁用其它TweenLite并且从masterList删除被禁用的TweenLite。这个过程说明了三点:第一点是所有TweenLite创建时都会记录在TweenLite.masterList静态属性引用的Dictionary中,这样可以实现从被作用的对象查找到相应的TweenLite,其实TweenMax创建时也会记录到masterList中,因为TweenMax是TweenLite的子类,而TimelineLite和TimelineMax则不会记录到masterList中。第二点是如果当前创建的TweenLite的overwrite=1,那么它会在创建时(注意不是在第一次渲染时)禁止其它已经创建并作用在同一个target上的TweenLite,而不论其它TweenLite是否开始真正开始发挥作用,当然此刻还没有创建的TweenLite当然不会被禁止。第三点是如果当前创建的TweenLite的overwrite不是1,那么就只记录到masterList中,其它作用在同一个target上的TweenLite不受在此时影响。
5 TweenLite构造函数的最后一步就是根据vars中是否有immediateRender设置,决定是否立即渲染Tween变化起始状态的效果。立即渲染(也就是在创建TweenLite时就执行渲染)有时很重要。区别在于:如果不执行立即渲染,那么TweenLite创建完成后,target中还保持原状,最快要等到下一个EnterFrame事件触发时,才会把target渲染成Tween的开始状态;而如果立即渲染的话,那么在TweenLite创建完成之后,target就已经被渲染成为Tween的开始状态。上述的target原状和Tween的开始状态之间最短会存在一帧时间的间隔。如果target原状和Tween的开始状态之间有明显差别的话,就会因为这一帧时间的间隔发生跳变。例如用TweenLite.from方法创建Tween的时候,target的原状和Tween的开始状态通常就是不一致的,因此TweenLite.from方法中默认就是设置immediateRender=true的,以避免产生跳变。实际上TweenLite第一次执行渲染的时候,还会有除了渲染本身之外的一些初始化工作,因此设置好是否在创建TweenLite时就执行第一次渲染是很重要的。另外,源代码中此处还存在一个小问题,也就是要检查TweenLite.active和vars.immediateRender来决定是否立即渲染,其实在TweenCore的构造函数中,active由三个标志“与”的值共同决定,其中一个标志就是immediateRender,因此这里检查active实际上是多余的,因为immediateRender=false时肯定active就是false,而immediateRender=true时,不论active怎样取值,肯定都立即渲染,因此这里可以把对active的检测去掉。