`

Flex 优化技巧 -- 全局CSS样式模块实现RSLS 方式加载

    博客分类:
  • Flex
 
阅读更多

小记:

   

   时隔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
分享到:
评论
2 楼 chaimzane 2014-08-08  
我现在自己都有点看不懂了

实际上很简单, LocaleModual 是可以不编译到Application里面的,而且在Application初始化之前加载好。 但是CSSModual 却不能这样,这里的代码就是实现他。
1 楼 muqingren 2014-06-28  


以我现在对flex的了解,没看懂你说的...........

相关推荐

    避免Flex RSL重复load 提高module加载性能的swc

    总结来说,避免Flex RSL重复加载的关键在于合理使用SWC进行模块化开发,通过预加载策略和多模块架构优化加载性能。通过这些方法,可以有效地减少网络传输的负担,提高应用程序的启动速度和整体运行效率,为用户提供...

    flex module ppt

    无论是桌面应用、Web应用还是移动应用,只要需要提高加载速度,优化代码结构,或者实现组件的复用,都可以采用模块化设计。 **如何使用Flex Module?** 创建Flex Module 需要在Flex项目中定义新的模块工程,然后将...

    配置Flex Builder 3.2来集成Flex 3.4 SDK

    本篇文章将详细介绍如何将较新的Flex 3.4 SDK配置进入Flex Builder 3.2环境中,以实现Flex开发环境的升级。 #### 一、获取Flex 3.4 SDK 首先,我们需要从Adobe官方网站下载Flex 3.4 SDK。访问以下链接: ...

    FriendsofED.AdvancED.Flex.Application.Development.Building.Rich.Media.X

    3. **搜索引擎优化(SEO)**:通过一系列SEO优化技巧,使Flex应用程序更容易被搜索引擎识别,从而获得更高的排名和搜索结果展示位置。 4. **Adobe Learning Library系列**:本书属于Adobe Learning Library系列的一...

    flex3的cookbook书籍完整版dpf(包含目录)

    flex3的cookbook书籍完整版dpf(包含目录),目录是我花了两个多小时自己整理的,希望对大家有帮助。 目录: 第一章.Flex与ActionScript基础(3) 1.1节.用FlexBuilder创建Flex项目 1.2节.用FlexBuilder创建Flex库项目 ...

    MiniCore:这是有关flex RSL的微型核心。-开源

    总的来说,MiniCore是一个小巧且功能强大的Flex RSL实现,它的开源性质鼓励了社区协作和技术创新,对于那些寻求优化Flex应用性能和减小资源占用的开发者来说,无疑是一个值得研究和利用的工具。通过深入理解并运用...

    dubins.zip_Dubins路径_cpp_dubins_dubins曲线程序_路径

    它由三部分组成:直线段(L)、右转(R)和左转(S),组合形式为LRSL、LSRS、RLSR、RSLS、LSRL、SRSL,其中L代表直线,S代表曲线,R代表右转,且S表示的是半径为无穷大的圆弧。 在C++中实现Dubins路径通常包括以下...

    ApplicationDomain的误解,安全沙箱有关内容

    1. **加载远程SWF文件时**:如果加载的是远程SWF文件(如RSLs),需要确保正确的`ApplicationDomain`配置,以便正确处理安全策略。 2. **跨ApplicationDomain的操作**:不同`ApplicationDomain`间的代码不能直接访问...

    焊料空隙对隧道再生半导体激光器温度分布的影响.pdf

    其中,隧道再生半导体激光器(Tunnel Junction Regenerated Semiconductor Lasers,TJ RSLs)因为其能够以较低的注入电流实现高输出功率而备受关注。然而,这种激光器的热量产生较为集中,散热问题成为限制其性能和...

    嵌入式实训平台硬件及技术参数.doc

    1. **Flash存储器支持**:平台支持商用串行SPI和并行BPI Flash存储器,允许快速数据读写,且可以实现多重启动功能,增加了系统的灵活性。 2. **乘法器**:嵌入式平台包含流水线和可级联的18x18乘法器,提高了计算...

Global site tag (gtag.js) - Google Analytics