as3顺播倒播类

一月 6th, 2010 § 0

一个as3的顺播倒播类,同时支持播放到帧或者帧标签。

使用办法如下:

1.open方法:

import flash.utils.TimeLineManger;

//open方法:顺播,要求目标帧(目标帧支持帧标签)必须大于当前帧。否则,无效果。
//15 为目标帧
//p1 为目标帧标签
//1  为前进速度
TimeLineManger.open(mc, 15, 1);
//TimeLineManger.open(mc, "p1", 1);

2.close方法:

import flash.utils.TimeLineManger;

//close方法:倒播,要求目标帧(目标帧支持帧标签)必须小于当前帧。否则,无效果。
TimeLineManger.close(mc, 15, 1);
//TimeLineManger.close(mc, "p1", 1);
//15 为目标帧
//p1 为目标帧标签
//1  为倒退速度

3.gotoFrame方法:

import flash.utils.TimeLineManger;

//gotoFrame:播放至某帧。根据目标帧,判断播放方向。
TimeLineManger.gotoFrame(mc, 15, 1);
//15 为目标帧
//1  为前进或者倒退速度

4.gotoFrameLabel方法:

import flash.utils.TimeLineManger;

//gotoFrameLabel:播放至某帧。根据目标帧,判断播放方向。
TimeLineManger.gotoFrameLabel(mc, "p1", 1);
//p1 为目标帧标签
//1  为前进或者倒退速度

整个类文件如下:

package utils {
	import flash.display.MovieClip;
	import flash.display.FrameLabel;
	import flash.events.Event;

	/**
	 * @author Hank
	 * MovieClip 顺播、倒播类
	 * 2009-10-7
	 *
	 * 2009-10-28 update
	 * 加入帧标签支持
	 *
	 */
	public class TimeLineManger
	{
		/*
		 * open方法:顺播,要求目标帧(目标帧支持帧标签)必须大于当前帧。否则,无效果。
		 * TimeLineManger.open(mc, 15, 1);
		 * TimeLineManger.open(mc, "p1", 1);
		 * 15 为目标帧
		 * p1 为目标帧标签
		 * 1  为前进速度
		 */
		static public function open(display : MovieClip, target : * = null, speed : Number = 1) : void
		{
			display.removeEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
			display.target = (target == null) ? display.totalFrames : (target is Number) ? target : targetFrameFromeLabel(display, target, "open");
			display.labels = display.currentLabels;
			display.speed = speed;
			display.dir = "open";
			display.addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
		}

		/*
		 * close方法:倒播,要求目标帧(目标帧支持帧标签)必须小于当前帧。否则,无效果。
		 * TimeLineManger.close(mc, 15, 1);
		 * TimeLineManger.close(mc, "p1", 1);
		 * 15 为目标帧
		 * p1 为目标帧标签
		 * 1  为倒退速度
		 *
		 */
		static public function close(display : MovieClip, target : * = null, speed : Number = 1) : void
		{
			display.removeEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
			display.target = (target == null) ? 1 : (target is Number) ? target : targetFrameFromeLabel(display, target, "close");
			display.speed = speed;
			display.dir = "close";
			display.addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
		}

		/*
		 * gotoFrame:播放至某帧。根据目标帧,判断播放方向。
		 * TimeLineManger.gotoFrame(mc, 15, 1);
		 * 15 为目标帧
		 * 1  为前进或者倒退速度
		 */
		static public function gotoFrame(display : MovieClip, frmae : int, speed : Number = 1) : void
		{
			display.removeEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
			display.target = frmae;
			display.dir = frmae > display.currentFrame ? "open" : "close";
			display.speed = speed;
			display.addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
		}

		/*
		 * gotoFrameLabel:播放至某帧。根据目标帧,判断播放方向。
		 * TimeLineManger.gotoFrameLabel(mc, "p1", 1);
		 * p1 为目标帧标签
		 * 1  为前进或者倒退速度
		 */
		static public function gotoFrameLabel(display : MovieClip, label : String, speed : Number = 1) : void
		{
			display.removeEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
			display.target = targetFrameFromeLabel(display, label);
			display.dir = display.target > display.currentFrame ? "open" : "close";
			display.speed = speed;
			display.addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
		}

		static private function onEnterFrameHandler(e : Event) : void
		{
			var display : MovieClip = e.currentTarget as MovieClip;
			var frame : Number;
			if(display.dir == "open") {
				frame = display.currentFrame + display.speed;
				if(frame >= display.target) {
					display.removeEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
					display.gotoAndStop(display.target);
				} else {
					display.gotoAndStop(frame);
				}
			} else if(display.dir == "close") {
				frame = display.currentFrame - display.speed;
				if(frame <= display.target) {
					display.removeEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
					display.gotoAndStop(display.target);
				} else {
					display.gotoAndStop(frame);
				}
			}
		}

		static private function targetFrameFromeLabel(display : MovieClip, traget : String, dir : String = "open") : uint
		{
			var labels : Array = display.currentLabels;
			for(var i:String in labels) {
				var label : FrameLabel = labels[i];
				if(label.name == traget) {
					return label.frame;
				}
			}
			return ((dir == "close") ? 1 : display.totalFrames);
		}
	}
}

Tagged: , , ,

§ Leave a Reply

What's this?

You are currently reading as3顺播倒播类 at 破民.

meta