асинхронный вариант
Код:
import mx.transitions.Blinds;
import mx.transitions.Transition;
import mx.transitions.TransitionManager;
import mx.transitions.Tween;
class com.onorange.lib.transitions.AsyncBlinds extends Blinds
{
private var tweenPositions:Array = new Array();
private var actualFrameRate:Number = 25;
private var totalFramesInAnimation:Number;
private var currentFrame:Number=0;
private var needDispatchEvent:Boolean=false;
private var delay:Number;
public function AsyncBlinds (content:MovieClip, transParams:Object, manager:TransitionManager)
{
this.init(content,transParams,manager);
}
private function init(content,transParams,manager):Void
{
super.init(content,transParams,manager);
actualFrameRate = transParams.fps;
totalFramesInAnimation = actualFrameRate*this.duration-4;
delay = Math.floor(totalFramesInAnimation/this._numStrips);
}
private function _resetTween():Void
{
currentFrame = 0;
needDispatchEvent=false;
// do clean-up of possibly existing tween
this._twn.stop();
this._twn.removeListener (this);
this._twn.stop();
this._twn = new Tween (this,
null,
this.easing,
0,
1,
this.duration/2,
true);
// need to first stop the tween and THEN set the prop to avoid rendering glitches
this._twn.stop();
this._twn.prop = "progress";
this._twn.addListener (this);
}
private function _render (p:Number):Void
{
if(!needDispatchEvent)
{
this.tweenPositions.push(p);
}
var h:Number = 100/this._numStrips;
var mask:MovieClip = this._innerMask;
mask.clear();
var i:Number = this._numStrips;
mask.beginFill (0xFF0000);
for(var i:Number=0;i<=this._numStrips;i++)
{
if(currentFrame>=i)
{
var f:Number = (currentFrame+i<this.tweenPositions.length-1)?Math.floor(currentFrame+i):this.tweenPositions.length-1;
var s:Number = this.tweenPositions[f]*h;
this.drawBox (mask, -50, i*h - 50, 100, s);
}
}
mask.endFill();
currentFrame++;
};
function onMotionFinished (src:Object):Void {
if(needDispatchEvent)
{
if (this.direction) {
this.dispatchEvent ({type:"transitionOutDone", target:this});
} else {
this.dispatchEvent ({type:"transitionInDone", target:this});
}
delete this._twn;
}else{
needDispatchEvent = true;
this._twn.yoyo();
}
}
}
Вставляем в classpath
запускаем аналогично
Код:
import flash.geom.Rectangle
import flash.geom.Point;
import mx.transitions.TransitionManager;
import mx.transitions.Blinds;
import mx.transitions.Transition;
import com.onorange.lib.transitions.AsyncBlinds;
import mx.transitions.easing.*;
function drawRect(size:Rectangle,color:Number):MovieClip {
var result:MovieClip = createEmptyMovieClip("mc_"+color+getTimer().toString+"_"+Math.random().toString,this.getNextHighestDepth());
result.beginFill(color);
result.moveTo(size.topLeft.x,size.topLeft.y);
result.lineTo(size.bottomRight.x,size.topLeft.y);
result.lineTo(size.bottomRight.x,size.bottomRight.y);
result.lineTo(size.topLeft.x,size.bottomRight.y);
result.lineTo(size.topLeft.x,size.topLeft.y);
result.endFill();
return result;
}
var tm2:TransitionManager = new TransitionManager(drawRect(new Rectangle(0,30,300,30),0xFF6600));
tm2.startTransition({type:AsyncBlinds, fps:50, direction:Transition.IN, duration:4, easing:Bounce.easeOut, numStrips:30, dimension:1});
не забыть про параметр fps, куда нужно вписать текущий fps .
щас думаю над вопросом авто определения.
|