当前:主 页>>
WebBase(基于AS3的Flash全站基架)
发布时间:2010-2-20 10:37:57 作者:望月狼  浏览: 自动滚屏(右键暂停)

现,已是AS3典盛时代,但Flash全站开发者们还是喜欢AS2的自由性,必竟客户看重的是效果,而富有高效与自由的开发技术才是各大制作公司的正确选择。

         不过,AS3不可比拟的优势还是让很多善未完成AS技术蜕变的Flash全站设计师们越越欲试,使用WebBase就是为了解决这个苦恼的难言之隐!

webBase用于Flash全站架构,支持动态地址,栏目过渡切换及高度动态设置。架构的任务是封装了核心交互功能,可以直接继承基类来使用,自动完成子SWF之间的通信传递。

 

 

>>DEMO在线体验 >>PDF程序字典  >>WebBase能做什么?  >>如何使用?  >>常见问题 >>全站开发个人观点

>>Blueidea中的讨论帖

*下载
已经发布更新版本,请点击这里查看

·2010-3-4  修复DEMO在IE8中主页加载停止问题。
·2010-2-25  修复火狐中高度无法动态改变。


一:WebBase能做什么?

1.              可以实现动态地址与标题。打开每一个页面都会在地址栏中产生一个伪地址并堆栈到IE的历史记录中,地址形式如:http://www.shch8.com/case/webbase/#/blog,我们可以使用这个地址来进入指定的动画页面。

2.              可以实现状态值的记录。比如,我们在产品展示中查看了一件商品,地址栏可以记录起来,如果你把这个地址发给朋友同样能够看到这个商品,状态值的使用可以弥补单个SWF中无法实现历史记录与动态地址的问题,地址形式如:http://www.shch8.com/case/webbase/#/about-tag2

3.              可以很方便地实现更换页面时的过渡动画。在进入另一个子页面时,会通知当前页面先播放结束动画,当结束动画播放完成了,再加载新的SWF文件。使用结束动画是开发Flash全站应该考虑的细节,也是区别于普通网页的一大亮点。

4.              垃圾回收机制。切换栏目时,会自动卸载旧的SWF文件,并提供卸载事件机制用于清除特定垃极,如声音或视频数据。

5.              Flash尺寸控制。也许会有这样的需求,我们每个子页面使用的页面高度可能不一样,你可以很轻松地设置各个子页面应该使用的宽度或高度,也就是改变IE的宽高,支持目前使用的绝大多数浏览器。

6.              互访功能。如果我们用了多级子SWF,各个页面之间的相互访问会是一个头疼的事,在一些偏向应用型的Flash全站中更是需要有个灵活的访问功能,WebBase提供了三种访问属性供你直接调用,分别为:主页面(rootPage),父页面(parentPage)和子页面(childPage)。

二:如何使用 

         1.实现原理。WebBase是一个基类包,所以你的Flash全站主框架页必须继承这个包,当然,这个包也是继承MovieClip编写的,因此,你不用当心在文档类中能否使用gotoAndPlay()的问题。架构原理如图1-1所示:

1-1 继承与调用流程

2.不管是主页还是子页,一律继承包里的ParentBase基类,当然,如果子页不需要作控制也可以不继承这个类。

继承ParentBase以后,你可以很自由地使用WebBase提供的方法了,先在主页中执行installMenu("config/menu.xml")方法,安装菜单配置的XML文件,这个XML文件编写规范请查看WebBase程序字典。

菜单安装完成后,会调度MenuEventINIT事件,可以在这里使用openPage()方法加载你的第一个子SWF文件了。

3.主框架的SWF文件插入到IE中时要先导入两个JS文件(swfobject.jsswfaddress.js),再使用embedSWF("main.swf","flashmov", '100%', '600', '9.0.45');方法插入SWF文件,具体使用方法请查看WebBase程序字典“插入IE中的方法”。

4由于使用JS 辅助控制,程序运行中AS 与JS 交互会受到播放器的安全限制,如果你在本地直接打开可能会受到阻拦,所以要挂在IIS 服务器上测试。当然你可以到官方网站上做全局安全性设置添加你要测试的地址。官方设置地址:
http://www.macromedia.com/support/documentation/cn/flashplayer/help/settings_ma
nager04.html

 

三:常见问题

1.为什么我用了openPage()方法没显示加载出来的页面?

答:有两个可能,其一,使用openPage()方法打开页面时,如果使用了播放结束动画也就是第三个参数为true时,那么程序会等待旧的SWF文件播完结束动画后才加载新页,所以你一定要确保旧SWF中播放完成结束动画时执行一次removeMe()通知父级可以加载新的SWF了。其二, openPage只是把子文件加载进来,并不负责添加到舞台上,所以你有充份的权限来控制加载进来的文件放在哪,你应该在子文件加载完成事件中执行一次addChild,如:

AS3代码
  1. private function addSwfFile(event:ParentEvent):void {   
  2.                             var loader:Loader = event.loader   
  3.                             this.addChild(loader);   
  4.                          }         

 

2.在结束动画播放完成后,能否方便地通知父级播放完成了?

         在手工制作的结束动画中,并非播放到主场景的最后一帧就表示完成结束动画,可能会在某一个影片剪辑中的帧上去通知父级完成播放,那么可以使用这样的代码:

AS3代码
  1. var obj: PageBase =this.parent.parent as PageBase;   
  2. obj.removeMe();   

你一定要看清楚这个影片剪辑相对舞台的层次来决定用几次parent,切保能访问到主场景为止,你可能会想问为什么不直接使用stage呢,因为当SWF被加载后,这个stage是表示主文件的舞台了。

这里还可以写一个方法来减去你算层次的工作,代码如下: 

AS3代码
  1. getPageBase(this).removeMe();   
  2. function getPageBase(thisObj:Object):PageBase {   
  3.          var obj:Object=thisObj;   
  4.          while (!(obj is PageBase)) {   
  5.                    obj = obj.parent;   
  6.                    if (obj is Stage) {   
  7.                             return null;   
  8.                    }   
  9.          }   
  10.          return obj as PageBase;   
  11. }  

3.能否在子文件中再用installMenu()来安装一个二级菜单?

一个Flash全站中,只能在主文件里执行installMenu(path:String)安装一次,如果子文件还有二级菜单,这个菜单列表应该也写在主文件的同一个XML菜单文件中,只要你取的id不会重复就行了,见意二级菜单取名使用一级菜单做前缀,如:about_addressabout_tel

4.为什么我用childPage直接调用public定义的方法时报错找不到这个方法?

由于每个SWF文件都是继承ParentBase的,所以我们在使用rootPageparentPagechildPage互相访时,这三个属性的类型是ParentBase的,但你可以用as操作符来向下转换,这样,就能访问某一SWF中文档类里所有public定义的方法和属性了。

例如,我们有一个about.swf的子SWF文件,当然这个文件中我们写了个文档类,取名为About.as,其中定义了一个public方法是showMsg(),那么,这个SWF被主程序加载后,可以使用childPage访问了,代码: 

AS3代码
  1. var about:About=childPage as About;   
  2. if(about!=null)about.showMsg();   

还有一点要注意的是,一定要切保其加载完成后再调用。

5.使用openPage()时如何定位在哪一级页面中打开?

WebBase中,有一个方法会是你最常用到的,就是openPage(),这个方法的第二个参数可以设置三种加载模式分别是:

BLANK:在当前作为子项从新加载

         TOP:在根目录中加载

         PARENT:在上一级目录中加载,加载后会替换自己

这里还有个灵活的用法,就是配合三种互访属性来使用,比如:

parentPage.openPage(“about.swf”,BLANK)openPage(“about.swf”, PARENT),这使用这两句执行的结果是一样的,也就是说一个是让父级执行加载来替换当前栏目,一个是从父级中加载来替换自己。

 

四:关于Flash全站开发个人观点

         在使用AS3开发Flash全站时,很多人会羞于把代码写在帧上,因为那是AS2.0落后者干的好事。我认为大可不必愧视自己的做法,目前来说,比较流行也是比较高效的做法大多是先在PS中设计好了以后才割过来做成Flash全站的。

这种方式有些你预想好的动画效果很难用纯AS来实现,所以最好就是你在帧上把动画效果做出来,再配合帧控制代码来实现交互效果。当然,你大的逻辑程序要写在类文件中,这是为了方便你开发与维护,而且当你把Flash全站开发熟练以后,你会喜欢把这些类文件考出来修修改改再重新设计界面就能快速地出炉一个新的作品。

这里与你说清楚一下Flash的一些原则,透露些小秘密:

1.使用文档类时,如果一个空的Fla文件默认是继承MovieClip的,当使用我们自己的文档类以后,你在帧上写代码也就相当于你在文档类中写代码了,所以有很多类你要在文档类中从新导入一次才能在帧上使用,比如TextField类你要在文档类中导入以后才能使用。

2.注意this的用法,我们对这个关键字是熟悉而又神秘。在方法体的内部,this表示调用方法的类实例,可以用来获取调用方。为了避免直接使用this时报错找不到属性或方法,可以把this转为Object类型再来调用所属的方法或属性,比如,var obj:Object=this; obj.install();这个技巧可用于在帧上调用文档类之时。

3.在获取时间轴上手工制作的一个影片剪辑时,我们会在属性面板中先对这个剪辑命名,如果这个影片剪辑又做有多个补间动画,也就是说时间轴中多个关键帧里都有这个剪辑,那么只要在第一次出现的关键帧中命名就行了,而且第一次出现的关键帧中必须命名,否则在程序将无法获取该对象。

4.注意帧播放延时,只有进入对象所在帧才能获取该对象。

 

 

 

By:wzh

 12/31/2009 11:09:53 AM

 

留言
姓名*
主页
Email
验证(请输入“shch8”)*
*
 

置顶