Flash幻灯片带fla源文件

flash-slider-cover.jpg

使用swf+xml结合的幻灯片程序,带fla源文件。如果要改动路径名,注意修改fla中的imgList相对路径。下载幻灯片程序:flash-slider.rar

AS3:dispatchEvent与事件流,点击事件的穿透性

AS3中的交互也是基于事件驱动的。这段时间,为了做一个导航栏,dispatchEvent方法深深的让我困惑!在多层的Sprite嵌套中,为了在最外层处理点击事件,我使用了dispatchEvent方法来传递点击事件。这种方法是可行的,不过其行为有一点点出乎我的意料。

捕捉点击事件,对事件的target实行类型转换的时候,没有转型成功。但是想要实现的效果,却达到了。这个问题困扰了我好久。直到我明白了点击事件的穿透性和dispatchEvent在事件流中扮演的角色以后,才豁然开朗。

在开始说重点之前,有必要介绍一篇文章给同样处于困惑状态中的朋友参考:

《dispatchEvent的应用》。此文基本上说明白了dispatchEvent的作用。

要明确一点,dispachEvent其实就是发起事件。并且,捕获该事件的,是已经注册了该事件监听器的对象自身。也就是说,事件的发起和捕获,发生在同一个对象身上。

既然如此,那么事件是如何传递给外层对象的呢?这个问题其实不是问题。因为发起事件是在对象内部,而捕获对象事件的处理方法,是控制该对象的另外一个对象。

回头来看多层Sprite构造的菜单点击事件这个实际情形。

为了把最底层的对象的点击事件传递给菜单的控制者,我逐层使用dispatchEvent方法进行对象传递。最底层是一个一个的SimpleButton对象,所以其点击事件的target必然是SimpleButton自身。菜单控制者可以轻易通过判断SimpleButton的upState对象的文字,来判断用户具体点击了哪个按钮。

逻辑并不复杂,唯一的意外发生在点击事件的穿透性上。我为每层Sprite都定义了点击事件的监听器。那么处在中间层的Sprite势必事件重复引发。监听器会监测到来自自身引发的事件,还会监测到由我手动添加的dispatchEvent方法所引发的事件。Sprite嵌套的层次越深,一次点击事件所引发的重复事件就越多!在我开发的例子中,我嵌套了2个内层,一次点击引发4次事件。

在这众多的事件中,只有一次是我们真正需要的!在我这个例子中,target是SimpleButton的那个事件,明显就是我最终想要的,而不是其它事件。明白了这个道理,事情就很好处理了。对target进行安全转型。如果转型成功,则执行我们想要的动作;如果转型不成功,则放弃对该事件的处理。像这样:

var btn:SimpleButton = e.target as SimpleButton;
if(!btn) return;
... 这里执行想要的动作...

这就是dispatchEvent和点击事件的穿透性,在事件流中的全部秘密。在为子对象做导航菜单时特别有用。直接传递点击事件的方式,可以让我们省敲许多代码。不过在处理逻辑上,就要特别小心在意了。

抛砖引玉,在这里我就不写详细的实例了。

如何在Flash Builder的ActionScript项目中使用Flash的UI组件?

Flash的UI组件为开发项目提供了方便。可是在Flash Builder中,默认是没有提供这些组件的。如何把这些组件搬过来呢?

当我们创建ActionScript项目时,是不能使用FLEX提供的UI控件的。除了可以使用第三方制作的UI库(如AsWing)之外还可以直接使用Flash CS4中内置的UI组件。方法如下:

  1. 在flash中新建一个工程,把所有的ui控件逐个拖放到场景中
  2. 进入菜单Publish Settings,将 Export SWC 项勾上
  3. Export Movie,输入文件名,确定之后就出现了swc文件
  4. 进入Flash builder,在项目属性中引用刚刚导出的swc文件
  5. import fl.controls.*;
  6. var btn:Button=new Button(); //直接创建UI控件即可。

终于找到可用的方法了。

方法来源:http://bbs.airia.cn/FLEX/thread-10130-1-1.html

AS3:被加载的swf产生错误:TypeError: Error #1009: Cannot access a property or method of a null

一个SWF单独运行时运作良好。被另一SWF加载后就产生错误:

TypeError: Error #1009: Cannot access a property or method of a null 

最近研究了主要的报错情况,在剖析报错情况前,先看下我们用的加载代码:

AS3代码
var loadSwf:Loader = new Loader;   
loadSwf.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCom)   
loadSwf.load(new URLRequest("demo.swf"))   
private function loadCom(event:Event):void {   
    var loadInfo:LoaderInfo = event.target as LoaderInfo;   
    var getSwf:DisplayObject = loadInfo.content as DisplayObject;   
    stage.addChild(getSwf);   
}

报错情况有以下几处:

1.显示对象根目录错误

有些人为图方便,直接在把Loader对象用addChild()添加到舞台上,这是错误的,因为有些子SWF的程序在文档类中,把parent看成是stage,而直接添加Loader对象,子SWF中的parent就是Loader了,Loader相当于另一个容器,而导致子SWF执行不正常.

解决方法:看看上面的加载代码,已经是解决方法了,第六行,我们获得的getSwf其实是一个文档类的实例化,因为文档类必须继承DisplayObject的,所以获取的类型为DisplayObject是肯定正确的.我们把文档类直接添加到stage中,这样就保证了与原SWF的结构一致.

2.加载进来提示无法访问空对象引用的属性或方法.

这是因为子SWF还没有添加到舞台上就调用stage了,这时stage是null值,所以提示这个错误.

解决方法:在子SWF的构造函数中,添加到舞台上再执行代码.

AS3代码
public function Main(){//构造函数
if (stage){   
        init();   
}else{   
        addEventListener(Event.ADDED_TO_STAGE, init);      
}}   
private function init(e:Event = null):void {      
//你的代码在这执行      
}  

来源:http://hi.baidu.com/80bith/blog/item/1ae4603522d5f01d90ef39f8.html

AS3运行时加载外部库,调用swf中的库

使用Flash Builder创建ActionScript项目,最苦恼的事情莫过于没有素材了。如果能通过运行时加载的方式提供素材,那么开发起项目来就事半功倍了!下面介绍的,正是这种运行时加载素材的方式。

【例1】
最近在网上看到一篇关于ApplicationDomain类的文章,有兴趣的朋友不防也去看看,
网址:http://eidiot.net/
参考:http://oliwen.blog.163.com/blog/static/38057532200772891112440/

浅显的研究了一下,发现用这个类竟可以调用加载进来的SWF库文件,嘿嘿,以后做大型的网络开发,这个功能可就能派上大用场了.现将代码公视如下:

var loader : Loader = new Loader();
var context : LoaderContext = new LoaderContext(true, ApplicationDomain.currentDomain);
/* 加载到同域(共享库) */
context.applicationDomain = ApplicationDomain.currentDomain;
//context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
这是我写在针上做的一个测试,m2为加载进来的SWF,Tm为m2库中的链接类名.
loader.load(new URLRequest("m2.swf"), context);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadcom);
function loadcom(the:Event):void
{
var runtimeClassRef:Class = getClass("Tm");
var greeter:MovieClip = new runtimeClassRef();
addChild(greeter);
greeter.x=100;
greeter.y=200;

function getClass(className:String):Class
{
   return loader.contentLoaderInfo.applicationDomain.getDefinition(className) as Class;
}
}


 

【例2】
---------------------LittleSpace 扩展修改------------------------------
SkinOverAllNoCaption.swf 为FLVPlayBack 组件的一个皮肤~
我这里只调用一个舞台上的按钮【"playpause_mc"】,播放暂停按钮,
此按钮的链接名为:fl.video.skin.PlayButtonNormal

舞台第一帧书写 : this.playButtonNormalState = "fl.video.skin.PlayButtonNormal";
Ctrl+Enter发布SkinOverAllNoCaption.swf

然后新建一个fla,在第一帧写入:
var request:URLRequest = new URLRequest("SkinOverAllNoCaption.swf");
var loader:Loader = new Loader();
var skinTemplate;//注意这里不能定义类型,否则出错[访问未定义的属性]
loader.contentLoaderInfo.addEventListener (Event.COMPLETE, loadComplete);
loader.load (request);
function loadComplete (event:Event):void
{
skinTemplate = Sprite(loader.content);
trace (skinTemplate );
addChild (skinTemplate );
trace (skinTemplate.pauseButtonOverState);
trace (skinTemplate.playpause_mc);
//与加载swf交互
skinTemplate.playpause_mc.addEventListener (MouseEvent.CLICK,clickHandler);
}
function clickHandler (e)
{
//获得加载的swf中的库的定义
var runtimeClassRef:Class = getClass(skinTemplate.playButtonNormalState);
//或者使用这句
// var runtimeClassRef:Class = getClass("fl.video.skin.PlayButtonNormal");
trace (runtimeClassRef is Class);
var greeter:MovieClip = new runtimeClassRef();
addChild (greeter);
}
function getClass (className:String):Class
{
return loader.contentLoaderInfo.applicationDomain.getDefinition(className) as Class;
}

来源:http://hi.baidu.com/8090boy/blog/item/47678ea71d46d398d14358a2.html

flash mp3播放器:可插入网页中当做背景音乐

地址:http://www.51119.com/play/

这个网页可定制3中风格的flash MP3播放器,支持多文件循环播放。网页背景音乐可以考虑用这种方式。

AS3发送邮件

去年的这个时候研究多使用as3发送邮件。主要是使用Socke连接smtp服务器,然后发送命令和数据。昨天正好有空,于是整理了一下。

下载地址:http://www.laaan.cn/assets/mailer.rar

使用示例:
var mailer:IMailer = new Mailer();//新建一个邮件发送器
mailer.setSMTP(”smtp.sohu.com”, 25);
mailer.setPassport(”****@sohu.com”, “*****”);//这里设置的是你的邮箱和密码,当然是明文

var mail:Mail = new Mail();
mail.from = “****@sohu.com
mail.fromName = “laan”;
mail.tu = “laan******@gmail.com”;//邮件
mail.cc = ["test@gmail.com"];//邮件抄送列表
发送地址mail.subject = “hello”;//邮件主题
mail.body = “test”;//邮件内容

//附件内容可选
var bytes:ByteArray = new ByteArray();
bytes.writeUTFBytes(”happy”);
mail.attachments = [new Attachment("test.txt", bytes)];//添加附件内容

mailer.sendMail(mail);//开始发送邮件

要注意的是,会有安全限制,所有在air程序中使用时比较适合的。如果你准备把你的swf打包成exe程序的话,也可是使用。主要是要在安全域内使用才会发送成功。另外一个需要说明的是,Mailer实现的是一种大众化的stmp服务连接,向163,sohu的邮箱都可以,但是gmail就不行了。而如果是126的话,你可以使用Mailer126,该类继承自Mailer,实现了126STMP服务器的链接。处于试验阶段,可以尝试一下

文章来源:http://www.laaan.cn/?p=1053

flash player debugger

搞程序开发,没有调试器简直无法想象!我就是在没有安装好调试器的状态下,开发了几个月。感觉累极了,出错的时候,要自己猜测错在了什么地方。

今天决心安装好带debug功能的flash player,方便调试。其实很简单,在安装之前,把所有可能用到flash的软件关闭基本上就能安装成功,包括QQ!

下载地址:http://www.adobe.com/support/flashplayer/downloads.html

TextField设置背景色

一直以为TextField不能设置背景色。其实可以。需要额外设定开关属性background。开启背景色以后,文本就不透明了。因为被背景色挡住了。默认是白色。

var tf:TextField = new TextField();

tf.background = true;

tf.backgroundColor = 0xed6a00;

TextField自适应宽度

原先以为TextField是不能自适应宽度的。原来可以。

使用TextFieldAutoSize类来设置自适应宽度的对齐方式。下面方式设置为左对齐。

var tf:TextField = new TextField();

tf.autoSize = TextFieldAutoSize.LEFT;

如果要设置成固定宽度,并能够自动换行的话,需要额外设置三个个属性:

var tf:TextField = new TextField();

tf.autoSize = TextFieldAutoSize.NONE;

tf.wordWrap = true;

tf.multiline = true;

tf.width = 300;

公告栏

  • 姓名:林剑锋(不见不散)
  • 来自:中国-广州
  • 简介:潮汕人,出生于广东揭西。醉心于Web开发8年,挑战了一年整体策划和网站运营。目前就职于平成混媒IT部。
  • Email/QQ:admin@ljf.cn

QQ群:设计学院 68075618,网站设计师 9908776

统计

文章:335篇
评论:163条 (2条Spam)
相册:1个 (120张图片)
主题:Nagrand新主题

www.ljf.cn网站PR查询