http://bbs.9ria.com/thread-62618-1-1.html
package
{
import com.greensock.events.*;
import com.greensock.loading.*;
import com.greensock.loading.display.*;
import com.greensock.plugins.*;
import fl.controls.Button;
import flash.display.*;
import flash.events.*;
/**
* 系统.
* @author 0924wyr
*/
[SWF(height = '500',width = '550')]
public class os extends Sprite
{
/** @private */
private var _xmlLoader:XMLLoader;
/** @private */
private var _imagesLoader:LoaderMax;
/** @private */
private var _items:Vector.<LoaderMaxDemoItem> = new Vector.<LoaderMaxDemoItem>;
/** @private */
private var names:Array = ['load','pause','resume','unload'];
/** 构造函数 */
public function os()
{
// 一定要记得激活!!!
LoaderMax.activate([ImageLoader]);
TweenPlugin.activate([ColorTransformPlugin]);
// 此插件用于增加tweenmax.to中的vars,colorTransform:{...},整个swf只需要声明一次即可
// 例如 TweenMax.to(mc,1,{colorTransform:{tint:0xff0000,tintAmout:0.5}});
// TweenMax.to(mc,1,{colorTransform:{brightness:0.5}}); // 这有变暗的效果,范围0 - 2, 全黑到全白
// 用..表示上一级目录
// LoaderMax vars参数
// 1. name:此参数用于指定该loader的实例名称,可以被用于LoaderMax.getLoader(name) or Loader.getContent(name),
// 或者任何时候被追踪到应该是唯一的,如果不指定将默认指定一个比如 loader21
// 2.maxConnections 指定同时加载的数量,默认是2
// 3.skipFailed 默认是true,true表示将跳过失败的加载,如果为false,遇到失败时这个加载将停止,同时加载的状态变为 LoaderStatus.FAILED
// 4.autoLoad 设置自动加载,不用手动load(). 无论何时再添加加载项目到max中,都将自行加载
// 5.loaders 需要放入加载队列的数组,XMLLoader、SWFLoader等对象
// 6.autoDispose 当complete的时候,将自动移除其他的监听事件
// 7.还有 onOpen(开始加载),onProgress(加载中),onComplete(完成加载),onError(失败)等事件
//swfloader有x,y,width,height,scaleMode,hAligh,container,等等。参看官方api吧
_xmlLoader = new XMLLoader('../asset/source.xml',{name:"sites",onComplete:onComplete,onError:onError});
// _xmlLoader.load();
initBtns();
// =======================
// swfloader test
// 指定container将立即被add到container中,不用手动执行addChild()
var swfLoader:SWFLoader = new SWFLoader('../asset/button.swf',{onComplete:swfComplete,container:this});// url: "http://www.greensock.com/_img/loadermax/sites.xml"
swfLoader.load();
}
/** @private for test */
private function swfComplete(e:LoaderEvent):void
{
var sp1:DisplayObject = e.target.content; // sp1.numChildren = 0
var sp2:DisplayObject = e.target.rawContent; // sp2.numChildren = 0
// addChild(sp1); // sp1 is ContentDisplay
// addChild(sp2); // sp2 is MovieClip
// 即content只表示了加载内容的容器,一个ContentDisplay对象,整个负责显示而已
// rawContent 表示加载的只是内容,MovieClip或者bitmap等,这样你可以访问swf中的属性或者方法
// 获取swf中的动态文本框内容:trace(sp2.tf.text); // 输出 i am a button.
// 读取sp1.tf会出错,因为不存在。
// 所以只显示的话,一半用content即可。还有一点就是在开始加载loader.load()时就可以用content注册鼠标事件等
//或者addChild到舞台
// XMLLoader只有content对象(XML),没有rawContent
}
/** @private */
private function initBtns():void
{
// 获取自带组件按钮的方法:新建fla,元件库中拖入一个按钮组件,然后发布设置勾选swc,再添加到lib即可。
for(var i:int = 0,len:int = names.length;i < len;++i)
{
var btn:Button = new Button;
btn.label = names[i];
btn.name = names[i];
addChild(btn);
btn.x = 25 + i * (btn.width + 10);
btn.y = stage.stageHeight - btn.height - 10;
btn.addEventListener(MouseEvent.CLICK, handlerBtn, false, 0, true);
}
}
/** @private */
private function onComplete(e:LoaderEvent):void
{
var sites:XMLList = (_xmlLoader.content as XML).site;
// LoaderCore.content :不同的Loader有不同的对象
// XMLLoader.content : XML
// SWFLoader,ImageLoader,VideoLoader: ContentDisplay(a sprite)
// MP3Loader: Sound
// LoaderMax:an array of sub loader's content
//-----------------------------
// ImageLoader,SWFLoader还有分content和rawContent,
var sub:XML;
var display:DisplayObject;
var item:LoaderMaxDemoItem;
for each(sub in sites)
{
// 通过 名字 获取已经加载好的图片,唯一instance name 用于此处
display = LoaderMax.getContent(sub.@name + "Thumb");
if(display)
{
item = new LoaderMaxDemoItem(sub.@name,display);
item.addEventListener(Event.CHANGE,updatePriorities);
_items.push(item);
}
}
for(var i:int = 0,len:int = _items.length;i < len; ++i)
{
item = _items[i];
this.addChild(item);
item.x = i % 5 * item.width + 25;
item.y = int(i / 5) * item.height + 54;
}
// name 用于getLoader,此loaderMax已有loaders等数据,从xml中直接获取
_imagesLoader = LoaderMax.getLoader('imagesLoader') as LoaderMax;
updatePriorities();
}
/** @private */
private function handlerBtn(e:MouseEvent):void
{
switch (e.target.name)
{
case names[0] :
_imagesLoader.maxConnections = 2;
_imagesLoader.load(false); // 参数 flushContent 如果为true,会重新再开始加载
return;
case names[1] :
_imagesLoader.pause(); // 暂停
return;
case names[2] :
_imagesLoader.resume(); // 不暂停,直接重新加载
return;
case names[3] :
_imagesLoader.unload(); // 移除所有已经加载的,并设置bytesLoaded = 0
return;
default :
throw new Error('unknown btn');
}
}
/** @private */
private function updatePriorities(e:Event = null):void
{
for(var i:int = 0,len:int = _items.length;i < len;++i)
{
_items[i].priorityLabel = _imagesLoader.getChildIndex(_items[i].imageLoader) + 1; // 获取加载的次序,初始是0
}
}
/** @private */
private function onError(e:LoaderEvent):void
{
throw new Error(e.type);
var box:Sprite;
}
}
}
package
{
import com.greensock.TweenMax;
import com.greensock.events.LoaderEvent;
import com.greensock.loading.*;
import flash.display.*;
import flash.events.*;
import flash.filters.GlowFilter;
import flash.text.*;
/**
* 子项.
* @author 0924wyr
*/
public class LoaderMaxDemoItem extends Sprite
{
/** @private **/
private var _thumbnail:DisplayObject;
/** 图片加载 **/
public var imageLoader:ImageLoader;
/** @private **/
private var _priorityLabel:int;
/** @private **/
private var _priorityTF:TextField;
/** @private **/
private var _progressTF:TextField;
/** @private **/
private var _progressBar:Shape;
/**
* 构造函数.
*
* @param name 实例名称.
* @param ins 显示对象.
*/
public function LoaderMaxDemoItem(name:String,ins:DisplayObject)
{
this.name = name;
_thumbnail = ins;
this.addChild(this._thumbnail);
// 应用brightness
TweenMax.to(this,0,{colorTransform:{brightness:0.5}});
initProgressTF();
_priorityTF = createText("left",3,2,65,4);
initProgressBar();
initImageLoader();
addMouseListener();
}
/** @private **/
private function initProgressTF():void
{
_progressTF = createText("right",68,this.height - 16,32,2);
_progressTF.text = "0%";
}
/** @private **/
private function initProgressBar():void
{
_progressBar = new Shape;
_progressBar.graphics.beginFill(9561600,1);
_progressBar.graphics.drawRect(0,0,100,6);
_progressBar.graphics.endFill();
addChild(_progressBar);
_progressBar.y = this._thumbnail.height;
_progressBar.scaleX = 0;
}
/** @private **/
private function initImageLoader():void
{
// getLoader by name,then addEventListener
this.imageLoader = LoaderMax.getLoader(this.name + "Image") as ImageLoader;
// bytesLoaded发生改变
this.imageLoader.addEventListener(LoaderEvent.PROGRESS,handlerLoader,false,0,true);
// 开始加载 OPEN
this.imageLoader.addEventListener(LoaderEvent.OPEN,handlerLoader,false,0,true);
}
/** @private **/
private function addMouseListener():void
{
this.addEventListener(MouseEvent.ROLL_OVER,handleMouseEvent,false,0,true);
this.addEventListener(MouseEvent.ROLL_OUT,handleMouseEvent,false,0,true);
this.addEventListener(MouseEvent.CLICK,handleMouseEvent,false,0,true);
}
/** @private **/
private function createText(tfAlign:String,tfX:Number,tfY:Number,tfWidth:Number,blureXY:int):TextField
{
var tf:TextField = new TextField();
tf.textColor = 16777215;
tf.defaultTextFormat = new TextFormat("Arial",11,16777215,null,null,null,null,null,tfAlign);
tf.x = tfX;
tf.y = tfY;
tf.width = tfWidth;
tf.height = 16;
tf.selectable = false;
tf.filters = [new GlowFilter(0,1,blureXY,blureXY,2,2)];
this.addChild(tf);
return tf;
}
/** @private **/
private function handlerLoader(e:LoaderEvent):void
{
switch(e.type)
{
case LoaderEvent.PROGRESS:
// e.target.progress or e.target.bytesLoaded 0 ~ 1
_progressTF.text = int(e.target.progress * 100) + "%";
_progressBar.scaleX = e.target.progress;
if(this.imageLoader.status != LoaderStatus.LOADING)
{
TweenMax.to(this,0.5,{colorTransform:{brightness:0.5}});
}// end if
break;
case LoaderEvent.OPEN:
TweenMax.to(this,0.2,{colorTransform:{brightness:1}});
break;
}
}
/** @private **/
private function handleMouseEvent(e:MouseEvent):void
{
switch(e.type)
{
case MouseEvent.CLICK:
this.imageLoader.prioritize();
dispatchEvent(new Event(Event.CHANGE));
return;
case MouseEvent.ROLL_OUT:
if(this.imageLoader.status == LoaderStatus.READY)
{
TweenMax.to(this,0.5,{colorTransform:{brightness:0.5}});
}// end if
return;
case MouseEvent.ROLL_OVER:
TweenMax.to(this,0.2,{colorTransform:{brightness:1}});
return;
}
}
/** 优先级标签. **/
public function get priorityLabel():int
{
return _priorityLabel;
}
public function set priorityLabel(value:int):void
{
_priorityLabel = value;
_priorityTF.text = value.toString();
}
}
}