`

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的了解,没看懂你说的...........

相关推荐

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

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

    MATLAB算法插值与拟合代码

    MATLAB算法插值与拟合代码提取方式是百度网盘分享地址

    基于二级计算机系统建立无取向硅钢轧制模型的研究

    随着计算机的发展及轧制自动化程度的提高,计算机控制系统在带钢热连轧生产线 中发挥着越来越重要的作用。硅钢作为钢中的艺术品,对轧制精度要求极高,传统的计 算机控制系统轧制模型并不能适应硅钢高精度轧制的生产要求,因此,开发设计精确的 轧制模型显得尤为重要。 本文以包钢CSP热连轧计算机控制系统为研究对象,针对原有轧制模型生产硅钢无 法达到成品厚度要求精度的问题,以新品种硅钢50SW800为研究对象,开发了适应性 较好的厚度精度控制轧制力模型与轧制力自学习模型,实际运行良好。主要工作及结论 如下: 通过分析大量硅钢轧制的重要工艺参数的变化规律,剔除温度、张力、摩擦力等影 响参数,主要针对带钢的变形抗力进行研究,采用微单元的塑性变形方程式,进行硅钢 变形抗力参数的计算,并利用在轧制时材料化学元素、变形率、温度、实际轧制压力、 理论轧制压力等数据通过多元线性回归得出新的轧制压力修正系数,最终成功构建了轧 制力模型,最终将该轧制力模型用于硅钢的轧制力设定预计算,首坯轧制偏差降低60%。

    uAI - AI Assistant 1.3.7人工智能助手Unity插件unitypackage项目源码C#

    uAI - AI Assistant 1.3.7人工智能助手Unity插件unitypackage项目源码C# 支持Unity版本2020.3.45或更高 uAI Assistant 是 Unity 的扩展,提供了一套强大的工具,由 OpenAI 最新的 GPT-4 Turbo 提供支持,具有 128k 上下文窗口、3.5 AI 模型以及 Dall-E 2 和 Dall-E 3。 uAI Assistant 中包含的 DemoScene 使用 Unity 包管理器中的 TextMeshPro 包作为 UI 文本。确保在导入此包之前导入它。 还要导入“TMP Essential Resources”,因为 DemoScene 使用“LiberationSans.ttf”字体。有关说明,请参阅文档。 uAI 助手? uAI Assistant 是 Unity 游戏引擎的强大扩展,它使用 GPT AI 帮助游戏开发人员轻松创建专业代码和引人入胜的游戏内容。 您需要 OpenAI 密钥才能使用 uAI Assistant!请阅读我们的文档以获取更多说明。 让你的纹理变得无缝 使用 AI 创建

    2024年全球液化天然气船用发电机组行业总体规模、主要企业国内外市场占有率及排名.docx

    2024年全球液化天然气船用发电机组行业总体规模、主要企业国内外市场占有率及排名

    AX3_model_extras-1.5.3-py3-none-any.whl.zip

    AX3_model_extras-1.5.3-py3-none-any.whl.zip

    人工智能+​NLP(Natural Language Processing)技术+技术原理图

    人工智能+​NLP(Natural Language Processing)技术+技术原理图 自然语言处理(NLP)是人工智能(AI)最热门的领域之一,这要归功于一些应用程序,如撰写连贯文章的文本生成器、欺骗人们认为自己有感知能力的聊天机器人,以及生成任何你能描述的真实图像的文本到图像程序。近年来,计算机理解人类语言、编程语言,甚至类似于语言的生物和化学序列,如DNA和蛋白质结构的能力发生了革命性的变化。最新的人工智能模型正在解锁这些领域,以分析输入文本的含义,并生成有意义、有表达力的输出。

    BCS-Service

    .Net core 6

    AVMSpeechMath-0.0.4-py3-none-any.whl.zip

    AVMSpeechMath-0.0.4-py3-none-any.whl.zip

    小学Scratch游戏化教学的实践研究-以泰州市Y小学为例

    随着智能教育时代的到来,计算机教育击彴祀勺中小学生必不可少的课程。我国陆续出台的文件,均指向鼓励在基础教育阶段开展编程课程。Scratch软件作为一种新型编程工具,以其简单易学、趣味性强等特点深受广大青少年丿谨i喜爱。但在日常教学中发现,传统讲授式教学方式不能长期维待学生学习兴趣,妇比以往学习效果大打折扣。2022年出版的《义务 教育信息科技课程标准》中明确指出,要求教育工作者创新教学方式,创设真实情境以提高 学生学习参与度。游戏化教学这种创新型教学方式, 在与各学科良好的结合效果下,也逐渐进入信息教育者的视野。因此本研究旨在将游戏化元素融入Scratch课堂,探究 Scratch游戏化教学设计一般流程在行动中不断峦进, 以期得到有效实施的策略和建议。 通过三轮行动研究,验证了小学Scratch游戏化教学的一般流程。同时总结出游戏化教学 应用策略,包括在游戏化教学设计时需要合理制定游戏规则,以控制课堂纪律和给予学生适当激励;明确小组分工,学生各司其职,在组内合作和组间竞争中培养学生合作精神;采用多元化评价方式,综合运用纸笔测试和个性创作等方法自评与他评相结合的方式,增强学 生自主学习能

    VB+access智能排课系统(源代码+可执行程序+4万字LW+答辩PPT)

    VB+Access智能排课系统是一个综合性的软件开发项目,旨在利用Visual Basic(VB)和Access数据库技术,为教育机构提供一个高效、智能的排课管理工具。 该系统通过深入分析教育机构的排课需求,设计了合理的数据库结构,包括教师信息、学生信息、课程安排等关键数据表。基于这些数据结构,系统实现了自动排课、手动调整、课程查询等功能,满足了教育机构对于排课工作的多样化需求。 在开发过程中,我们注重用户体验,设计了简洁明了的界面和流畅的操作流程。用户可以通过系统快速录入课程信息、教师资源和学生名单,系统则能够自动根据预设规则进行排课,大大减轻了人工排课的负担。同时,系统还提供了手动调整功能,方便用户对自动排课结果进行微调和优化。 此外,我们还为该系统撰写了详尽的4万字论文,深入探讨了智能排课系统的设计理念、实现方法以及在教育领域的应用前景。同时,为了方便答辩,我们还制作了答辩PPT,清晰展示了系统的功能特点、技术实现和应用效果。

    2024-2030全球及中国液化天然气船用发电机组行业研究及十五五规划分析报告.docx

    2024-2030全球及中国液化天然气船用发电机组行业研究及十五五规划分析报告

    Python安装文件(MAC苹果系统)

    0.Python安装教程-Mac、pycharm-community-2022.2.1、python-3.10.7-macos11

    Acquisition-4.11-cp37-cp37m-manylinux_2_17_aarch64.whl.zip

    Acquisition-4.11-cp37-cp37m-manylinux_2_17_aarch64.whl.zip

    算法参考资料温度控制的PID程序

    算法参考资料温度控制的PID程序提取方式是百度网盘分享地址

    AccessControl-6.0-cp311-cp311-manylinux_2_5_i686.whl.zip

    AccessControl-6.0-cp311-cp311-manylinux_2_5_i686.whl.zip

    Acquisition-4.11-cp39-cp39-manylinux_2_5_i686.whl.zip

    Acquisition-4.11-cp39-cp39-manylinux_2_5_i686.whl.zip

    AccessControl-5.3-cp36-cp36m-manylinux_2_5_i686.whl.zip

    AccessControl-5.3-cp36-cp36m-manylinux_2_5_i686.whl.zip

    AccessControl-5.5-cp39-cp39-manylinux_2_17_aarch64.whl.zip

    AccessControl-5.5-cp39-cp39-manylinux_2_17_aarch64.whl.zip

    MATLAB算法GRNN的数据预测广义回归神经网络货运量预测

    MATLAB算法GRNN的数据预测-基于广义回归神经网络货运量预测提取方式是百度网盘分享地址

Global site tag (gtag.js) - Google Analytics