/** * VIDEO SCRUBBER * ---------------- * * @usage Lets the user grab, scrub, throw a loaded flv * * @author Rackdoll ( http://blog.rackdoll.nl ) * @version VideoScrubber 1.0 Release. * * @author Vladimir ( http://despark.com ) * @version VideoScrubber 2.0 Revisited, VideoAdapter 1.0 Release * * */ package { import flash.display.MovieClip; import flash.display.Stage; import flash.events.Event; import flash.events.MouseEvent; import flash.utils.getTimer; public class VideoScrubber { private var stage:Stage; private var clip:MovieClip; private var startPos:Number; private var endPos:Number; private var startTime:Number; private var endTime:Number; private var timeUnit:Number; private var speedUnit:Number; private var currFrame:Number; private var obj:Object = new Object(); public function VideoScrubber( $stage:Stage, $clip:MovieClip ) { stage = $stage; clip = $clip; startTime = 0; endTime = 0; startPos = endPos = currFrame = 0; obj.currFrame = 0; build(); } private function build():void { stage.addChild( clip ); trace( stage, clip, clip.parent ); clip.gotoAndStop(1); clip.buttonMode = true; stage.addEventListener( MouseEvent.MOUSE_DOWN, onDown); stage.addEventListener( MouseEvent.MOUSE_UP, onUp ); } private function onDown( evt:MouseEvent ):void { stage.removeEventListener( Event.ENTER_FRAME, tweenToFrame ); oriX = stage.mouseX; aDelta = []; startPos = stage.mouseX - endPos; startTime = getTimer(); currX = stage.mouseX; stage.addEventListener( Event.ENTER_FRAME, onDrag ); onDrag(); } private var precision:int = 5; private var currX:Number = 0; private var prevX:Number = 0; private var deltaX:Number = 0; private var aDelta:Array = new Array(); private var time:Number = 0; private var oriX:Number = 0; private function onDrag(e:Event = null ):void { time++; prevX = currX; currX = stage.mouseX; //deltaX = currX - prevX; var currDeltaX:Number = currX - prevX; aDelta.push( currDeltaX ); if( aDelta.length >= precision ) aDelta.shift(); calcDelta(); gotoFrame( Math.round( clip.currentFrame + deltaX ) ); } private function calcDelta():void { deltaX = 0; for (var i:int = 0; i < aDelta.length; i++) { deltaX += aDelta[i]; } deltaX /= aDelta.length } private function gotoFrame( $frame:int ):void { var frame:int = $frame; if ( frame < 0 ) frame = clip.totalFrames + frame; if ( frame > clip.totalFrames ) frame = frame - clip.totalFrames; clip.gotoAndStop( frame ); trace(frame); } private function onUp( Evt:MouseEvent ):void { stage.removeEventListener( Event.ENTER_FRAME, onDrag ); prevX = currX; currX = stage.mouseX; deltaX = currX - prevX; if ( deltaX == 0 && stage.mouseX == oriX ) { deltaX = -(((clip.width >> 1) - clip.mouseX ) / 10); if ( deltaX < 0 ) deltaX = -6; else if ( deltaX > 0 ) deltaX = 6; } if ( deltaX == 0 && stage.mouseX != oriX ) return; //trace(deltaX ); tweenToFrame(); stage.addEventListener( Event.ENTER_FRAME, tweenToFrame ); } private function tweenToFrame( e:Event = null ):void { gotoFrame( Math.round( clip.currentFrame + deltaX ) ); deltaX *= .95; if ( deltaX > -1 && deltaX < 1 ) stage.removeEventListener( Event.ENTER_FRAME, tweenToFrame ); } } }