使用软件:flash   阅读次数:   收录时间:2008-08-12

As3.0 xml + Loader应用

作者:Mirage  来源:A客堂

其实很简单是两部分组成的,只是两个MC,rejigger_mc和loadPic_mc,前者是负责加载XML以及如何显示图片的整个SWF的主干,而后者只是为了加载图片显示进度的一个小零件。
以前2.0时,我把代码分别写在rejigger_mc和loadPic_mc的时间轴上,然后在rejigger_mc里黏贴N多个 loadPic_mc,可现在不行啦,他们不让我那么做,我只好把代码写在两个rejigger_mc.as和loadPic_mc.as外部文件里。
注:这些文件的布局如下,文件夹ActionScript里含rejigger_mc.as和loadPic_mc.as


我以混乱的思维浅薄的学识来聊聊我写的东西。。。。首先是loadPic_mc.as文件



package ActionScript{//包是什么,我的理解它就是文件夹,不就是为了完全限定名称吗
import flash.net.URLRequest;
import flash.display.Loader;
import flash.events.*;
import flash.display.MovieClip;
import flash.text.TextField;
import fl.transitions.Tween;
import fl.transitions.easing.Back;
import fl.transitions.TweenEvent;
//变了啊,真的变了,现在用什么东西都得冲人家张口借,尽管是免费的,我曾经偷//偷地在所关联的MC里放了一个文本框,结果还是被发现了,你说我和 FLASH打//了多少年的交道,多多少少有点感情吧??,最后我不得不import flash.text.TextField;

public class loadPic_mc extends MovieClip { 
//类名原来就是脚本文件名 
public var fun:Function; 
//定义了一个属性他的再次出现在最后一行 
private var per_txt:TextField; 
//显示加载进度 
private var loadPic:Loader; 
private var dispatcher:IEventDispatcher; 
//上面的这些变量曾经我是声明在主时间轴的最顶端的 
public function loadPic_mc(str:String):void {//构造函数,现在完全多了个这个东东,据我观察,当你声明一个类时,不管你愿不愿意它都会执行这个函数 
var request:URLRequest=new URLRequest(str); 
loadPic=new Loader(); 

dispatcher=loadPic.contentLoaderInfo; 
dispatcher.addEventListener(Event.COMPLETE,loadComH); 
dispatcher.addEventListener(Event.OPEN,loadOpenH); 
dispatcher.addEventListener(ProgressEvent.PROGRESS,loadProgH); 
//订阅事件呢 
loadPic.load(request); 
//一个载入多写了几行,要是从3.0转型到2.0那该多快 


per_txt=new TextField(); 
per_txt.x=10; 
per_txt.y=55; 
per_txt.width=150; 
per_txt.textColor=0xB3CCCC; 
this.motionLoad_mc.visible=false; 
//在loadPic_mc的舞台上所含的一个MC,有时间轴的 
this.addChild(loadPic); 
//曾经用this指东指西的,现在呢,不能再乱指了,只能指本类, 
this.addChild(per_txt); 
} 
private function loadOpenH(event:Event):void { 
this.motionLoad_mc.visible=true; 
per_txt.text="正在载入。。。。"; 
loadPic.alpha=0; 
//开始下载时调度 
} 
private function loadProgH(event:ProgressEvent):void { 
per_txt.text="已载入。。。。"+uint(event.bytesLoaded/event.bytesTotal*100)+"%"; 
//下载过程中调度 

} 
private function loadComH(event:Event):void { 
var aTween:Tween = new Tween( loadPic, "alpha", Back.easeOut,0, 1, 2, true); 
aTween.addEventListener(TweenEvent.MOTION_FINISH,disPic); 
//其实完全没必要订阅这个事件,只是想联系一下Tween类 
this.removeChild(this.motionLoad_mc); 
this.removeChild(per_txt); 
//显示对象很帅吧以后就再也不要_mc[newmc+”I”]去找对象了 

dispatcher.removeEventListener(Event.COMPLETE,loadComH); 
dispatcher.removeEventListener(Event.OPEN,loadOpenH); 
dispatcher.removeEventListener(ProgressEvent.PROGRESS,loadProgH); 
//清除监听,便于处理垃圾 
} 
private function disPic(event:TweenEvent){ 
fun(); 
//调用函数fun 
} 
} 
} 
//写完此类了 其实3.0语言一看很有层次感的,8错8错 

下面在库里找到loadPic_mc 右键 –链接 类里填入:ActionScript.loadPic_mc
注: loadPic_mc里只含一个元件motionLoad_mc

接下来编写类rejigger_mc.as

package ActionScript{ 
import flash.net.URLLoader; 
import flash.net.URLRequest; 
import flash.events.*; 

import flash.display.SimpleButton; 
import flash.display.Sprite; 
import fl.transitions.Tween; 
import fl.transitions.easing.Back; 
import ActionScript.loadPic_mc; 

public class rejigger_mc extends Sprite { 
private var sprite:Sprite; 
private var portraitXml:XML; 
private var loadXml:URLLoader; 
private var dispatcher:IEventDispatcher; 
private var i:uint; 
private var len:uint; 
private var m:uint; 
//这些属性都是私有的从此类外部是无法访问的 

public function rejigger_mc():void { 
var request:URLRequest=new URLRequest("portrait.xml"); 
loadXml=new URLLoader(request); 
//载入外部XML文件 
loadXml.addEventListener(Event.COMPLETE,comH); 

} 

private function comH(event:Event) { 
portraitXml=new XML(event.target.data); 
sprite=new Sprite(); 
//这个其实就是装loadPic_mc的容器 
sprite.x=10; 
sprite.y=10; 
this.addChild(sprite); 
var maskSprite:Sprite=new Sprite(); 
//只是为了遮盖 所以不必添加到显示列表中 
maskSprite.graphics.beginFill(0xffffff); 
maskSprite.graphics.drawRect(10,10,150,80); 
maskSprite.graphics.endFill(); 
sprite.mask=maskSprite; 

this.right_btn.addEventListener(MouseEvent.CLICK,moveRight); 
this.left_btn.addEventListener(MouseEvent.CLICK,moveLeft); 
//又该订阅事件了 
i=0; 
len=0; 
for (var item:String in portraitXml.part) { 
len++; 
//不知道怎么取得XML子节点的长度,要是转换为XML文档类的话觉得很麻烦 
} 
loadPor(); 

loadXml.removeEventListener(Event.COMPLETE,comH); 
//卸载监听 
} 
private function loadPor():void { 
if (i<len) { 
var loadPic:loadPic_mc=new loadPic_mc(portraitXml.part{i}.@path);//基于发布系统的问题,此处的大括号需要换为中括号. 
loadPic.fun=loadPor; 
sprite.addChild(loadPic); 
//在sprite里添加显示对象loadPic 
loadPic.x=i*150; 

i++; 
} else { 
return; 
} 
} 
private function moveRight(event:MouseEvent) { 
if (m>0) { 
m--; 
var aTween:Tween = new Tween( sprite, "x", Back.easeOut, sprite.x, 10-m*150, 1, true); 
//移动是直接移动sprite,因为sprite里含N多个loadPic 
} else { 
return; 
} 
} 
private function moveLeft(event:MouseEvent) { 
if (m<len-1) { 
m++; 
var aTween:Tween = new Tween( sprite, "x", Back.easeOut, sprite.x, 10-m*150, 1, true); 
} else { 
return; 
} 
} 
} 
} 

在库里找到rejigger_mc 右键 –链接 类里填入:ActionScript. rejigger_mc
基类可以写成flash.display.Sprite 因为这个类扩展的是Sprite类
注:rejigger_mc里只含两个元件 都是按钮

最后一步,是在主时间上写上代码如下:

this.stage.frameRate=31;
this.stage.scaleMode=StageScaleMode.NO_SCALE;
this.stage.align=StageAlign.TOP_LEFT;

import ActionScript.rejigger_mc;
var myrejigger:rejigger_mc=new rejigger_mc();
addChild
(myrejigger);

还不错吧,对比下XML+MovieClipLoader类就知道了,编写3.0首先代码布局上有很层次感,容易阅读,我想这点主要归功于处理事件机制了,显示对象不在像以前那样混乱,现在更有层次感。其次处理XML比以前要便捷,最后呢,最重要的一点就是编完之后有种酷酷的感觉,代码和界面的分离。。。。。

可能刚开始有很多的不习惯尽管事实上没有2.0方便吧,但做的东西多了相信你一定会体会更多的优越性,足够弥补它的不便。

    评论加载中…
教程导航
FLASH/AS热门教程
打造闪光略过的动画logo
效果: 源文件: 1、首先我们把背景选为黑色。再输入文字用白色填充,注意调整文字之间的间隔。 2、选中字体,对其进行转换为路径文件。 3、对间隔再做少许调整...
作者:no1xium
FLASH完美的loading制作原理
共三部分: 1、基础 2、MovieClipLoader相关讨论(较深入) 3、V2组件相关问题 一、基础 很久没有发技术日志了,要来就来个完美的。您别激动,一个小小的loading谈...
作者:awflasher
用Flash AS行代码画一棵漂亮的树
本文中我们用用Flash AS代码来画一棵漂亮的树,只有25行代码。 AS代码如下: varmc=this; functiondl(ax,ay,bx,by){ mc.moveTo(ax,ay); mc.lineStyle(0,0x000000...
作者:love黄家驹
[鬼市课堂]1-3 AS写在哪里-写在MC
学习目的: 初步掌握在MC上写AS的规则 教材内容: 首先应当明确,目前大家公认的对影片剪辑(MovieClip)的称呼MC,如何创建一个MC呢?请按照下列方法之一操作: 1、...
作者:鬼市
Flash实例教程:通过实例学习AS3.0
学习目的: 通过个实例了解到: 1.AS3采用了新的监听机制.例如: 添加事件:boarder_mc.addEventListener(MouseEvent.MOUSE_DOWN, drag); 事作处理函数: functio...
作者:lzyy 翻译