小记:
时隔3年游戏开发后又回到了Flex的开发上面来。虽然现在的Flex的热度已经大不如以前,甚至到了Flex SDK 4.7 版本Adobe Flash Builder 干脆连设计试图都不支持了。如今的Flex SDK, 4.6, 4.7 已经和之前大不一样了。比如之前的滚动的处理实现,CSS样式域的问题,现如今都得到了一一支持。但是不管怎么样Flex SDK 的优越性在目前市面上所有的Flash UI FrameWork中,他们都是无法比拟的。
再次接触Flex sdk 发现还是有点不尽人意的地方,比如在主题样式和资源这块。在project Compile Option中加入-keep-generated-actionscript 参数时会在项目的bin文件下生成对应的Actionscript代码。如下图:
其中包含了默认的Locale 资源和 默认的Theme 资源。
对于Locale 资源我们可以在project Compile Option 加入 -locale, 这样默认的一套Locale Resource就可以做成ResourceModual 了, 而且是可以RSls加载支持的。
但是对于Defualt Theme 这块是去不掉的, 如果每个Project都一样的花,这个有点浪费资源了,虽然不大到目前为止(除掉Locale Resource)一个空的Project 大概38K。
对于Local 的资源我的构想是 Default Local Resource Modual + Custom Defined Local Resource Modual
对于样式这块的资源我的构想是 defualt Theme Modual + Global CSS Style Modual + Custom CSS Style Modual
对于样式这块,采用Rsls方式去实现,估计是不可能的,可以去看下生成的代码。不但是这样,就连我想加一个全局样式模块都不可以。
大概能使用的就是,在Application 中 使用styleManager.loadStyleDeclarations()去加载了,或者在Custom Preload Bar中去加载,但是不管怎么样,一定是在Application初始化后才能做的。
下面我来介绍一中方式,大概和Rsls类似的效果,而且是在New Application 之前发生的。 但是,为什么一定要纠结在 new Appication 之前,因为运行时切换皮肤是很耗资源的能不要这样做就不要这样做。
看下实现过程:
package com.citi.crm.flex
{
import flash.display.DisplayObject;
import flash.events.IEventDispatcher;
import flash.events.ProgressEvent;
import mx.core.IFlexModuleFactory;
import mx.core.mx_internal;
import mx.events.StyleEvent;
import mx.managers.ISystemManagerChildManager;
import mx.managers.systemClasses.ChildManager;
import mx.styles.IStyleManager2;
use namespace mx_internal;
[Mixin]
public class FakeChildManager implements ISystemManagerChildManager
{
private static var _instance:FakeChildManager;
private static var _styleURL:String;
public static function init(fbs:IFlexModuleFactory):void
{
// _styleURL = "ClientInsightCRM_GlobalStyle.swf";
_styleURL = Object(fbs).loaderInfo.parameters.gStyleURL;
if(_styleURL)
{
//for hold the instance
_instance = new FakeChildManager(fbs);
}
}
private var _systemManager:Object;
private var _realChildManager:ISystemManagerChildManager;
private var _styleLoadWatcher:IEventDispatcher;
public function FakeChildManager(systemManager:IFlexModuleFactory)
{
super();
_systemManager = systemManager;
_realChildManager = _systemManager["childManager"];
_systemManager["childManager"] = this;
}
//ISystemManagerChildManager Interface
public function initializeTopLevelWindow(width:Number, height:Number):void
{
//just complete initializeTopLevelWindow function instead in hakc way.
doOurLoadingFlow();
}
protected function doOurLoadingFlow():void
{
var styleManager:Object = _systemManager.getImplementation("mx.styles::IStyleManager2");
_styleLoadWatcher = IEventDispatcher(Object(styleManager).loadStyleDeclarations(_styleURL, false));
_styleLoadWatcher.addEventListener(StyleEvent.PROGRESS, gStyleProgressHandler);
_styleLoadWatcher.addEventListener(StyleEvent.COMPLETE, gStyleCompleteHandler);
_styleLoadWatcher.addEventListener(StyleEvent.ERROR, gStyleErrorHandler);
}
protected function onDoOurLoadingFlowEnd():void
{
_styleLoadWatcher.removeEventListener(StyleEvent.PROGRESS, gStyleProgressHandler);
_styleLoadWatcher.removeEventListener(StyleEvent.COMPLETE, gStyleCompleteHandler);
_styleLoadWatcher.removeEventListener(StyleEvent.ERROR, gStyleErrorHandler);
_styleLoadWatcher = null;
_systemManager["childManager"] = _realChildManager;
_realChildManager.initializeTopLevelWindow(_systemManager.width, _systemManager.height);
_realChildManager = null;
_systemManager = null;
_instance = null;
_styleURL = null;
}
public function addingChild(child:DisplayObject):void {};
public function childAdded(child:DisplayObject):void {};
public function childRemoved(child:DisplayObject):void {};
public function removingChild(child:DisplayObject):void {};
//event handler
private function gStyleProgressHandler(event:StyleEvent):void
{
IEventDispatcher(_systemManager.preloader).dispatchEvent(new ProgressEvent(ProgressEvent.PROGRESS,
false, false, event.bytesLoaded, event.bytesTotal));
}
private function gStyleCompleteHandler(event:StyleEvent):void
{
onDoOurLoadingFlowEnd();
}
private function gStyleErrorHandler(event:StyleEvent):void
{
//just skip it
onDoOurLoadingFlowEnd();
}
}
}
一定 需要将此类引用到项目中,不然不会作用的。
Mixin 元标签是保证,在new Application 之前调用 public static function init(fbs:IFlexModuleFactory):void 执行代码。而且在构造函数里面我们偷偷换掉了SystemManager 中的ChildManager的引用对象,改为当前,
因为我们就是要阻止实际的ChildManager的initializeTopLevelWindow()函数的执行, 在FakeChildManager 的initializeTopLevelWindow,
我们来做自己的事情,等完成后在把SystemManager 中的ChildManager引用换成原来真实的ChildManager 对象, 并调用initializeTopLevelWindow。
这种方式我认为是最简洁的实现Css modual Rsls 的加载方式。 你们有什么好办法?
- 大小: 138.6 KB
分享到:
相关推荐
总结来说,避免Flex RSL重复加载的关键在于合理使用SWC进行模块化开发,通过预加载策略和多模块架构优化加载性能。通过这些方法,可以有效地减少网络传输的负担,提高应用程序的启动速度和整体运行效率,为用户提供...
无论是桌面应用、Web应用还是移动应用,只要需要提高加载速度,优化代码结构,或者实现组件的复用,都可以采用模块化设计。 **如何使用Flex Module?** 创建Flex Module 需要在Flex项目中定义新的模块工程,然后将...
本篇文章将详细介绍如何将较新的Flex 3.4 SDK配置进入Flex Builder 3.2环境中,以实现Flex开发环境的升级。 #### 一、获取Flex 3.4 SDK 首先,我们需要从Adobe官方网站下载Flex 3.4 SDK。访问以下链接: ...
3. **搜索引擎优化(SEO)**:通过一系列SEO优化技巧,使Flex应用程序更容易被搜索引擎识别,从而获得更高的排名和搜索结果展示位置。 4. **Adobe Learning Library系列**:本书属于Adobe Learning Library系列的一...
flex3的cookbook书籍完整版dpf(包含目录),目录是我花了两个多小时自己整理的,希望对大家有帮助。 目录: 第一章.Flex与ActionScript基础(3) 1.1节.用FlexBuilder创建Flex项目 1.2节.用FlexBuilder创建Flex库项目 ...
总的来说,MiniCore是一个小巧且功能强大的Flex RSL实现,它的开源性质鼓励了社区协作和技术创新,对于那些寻求优化Flex应用性能和减小资源占用的开发者来说,无疑是一个值得研究和利用的工具。通过深入理解并运用...
它由三部分组成:直线段(L)、右转(R)和左转(S),组合形式为LRSL、LSRS、RLSR、RSLS、LSRL、SRSL,其中L代表直线,S代表曲线,R代表右转,且S表示的是半径为无穷大的圆弧。 在C++中实现Dubins路径通常包括以下...
1. **加载远程SWF文件时**:如果加载的是远程SWF文件(如RSLs),需要确保正确的`ApplicationDomain`配置,以便正确处理安全策略。 2. **跨ApplicationDomain的操作**:不同`ApplicationDomain`间的代码不能直接访问...
其中,隧道再生半导体激光器(Tunnel Junction Regenerated Semiconductor Lasers,TJ RSLs)因为其能够以较低的注入电流实现高输出功率而备受关注。然而,这种激光器的热量产生较为集中,散热问题成为限制其性能和...
1. **Flash存储器支持**:平台支持商用串行SPI和并行BPI Flash存储器,允许快速数据读写,且可以实现多重启动功能,增加了系统的灵活性。 2. **乘法器**:嵌入式平台包含流水线和可级联的18x18乘法器,提高了计算...