本篇介绍了通过As3的条件反射机制,getDefinition方法实现动态加载 UI的一种实现

一篇翻译的文章,来自 The Kiwi Project ,这种方法很有用,但是唯一的问题就是,在加载皮肤的过程中,用户等待的问题。如果皮肤文件 比较大,没有加载上来之前,程序 可以说是无反应的,这样需要我们以某种方式提醒用户当前程序的工作。

文中需要的资源文件在附件里:

实时加载 Flex 皮肤
目前,有很多关于如何在你的 Flex 程序中绘制皮肤的资源。
概述:Flex 支持两种绘制皮肤的方法:贴图和编程。贴图皮肤是在Flash 、Photoshop、Firework等软件 中创建皮肤资源图像,然后将他们导入(embed)到 Flex 程序中;编程皮肤是建立一个通过程序定义一个控件 皮肤的 ActionScript 类。你可能猜到,贴图皮肤比较简单,编程皮肤可以实现更加丰富的效果。
这两个方法都有一个共同的缺点是,皮肤资源(对于贴图来说是 SWF/PNG/GIF 等文件,对于编程来说是那个 AS 类)必须在程序编译时就被包括。怎么改进呢?在这篇文章中我将演示一个如何实时加载贴图皮肤的巧妙方法。
为了使这个例子 尽可能的简单,我仅建立一个只有一个按钮的 Flex 程序,这个按钮的皮肤是动态添加的。本程序将实时取得一个皮肤 SWF 文件,加载皮肤,然后把它们应用到按钮上。

第一步:为皮肤资源建立一个外壳 SWF
目的,有了这个外壳 SWF,我的 Flex 程序就可以实时加载皮肤中适当的资源

  1. package
  2. {
  3. import flash.display.Sprite;
  4. public class Wrapper extends Sprite
  5. {
  6. [Embed(source="flex _skins.swf ",symbol="RadioButton_upIcon")]
  7. public var rbUpSkin: Class;
  8. [Embed(source="flex_skins.swf",symbol="RadioButton_downIcon")]
  9. public var rbDownSkin: Class;
  10. [Embed(source="flex_skins.swf",symbol="RadioButton_disabledIcon")]
  11. public var rbDisabledSkin: Class;
  12. [Embed(source="flex_skins.swf",symbol="RadioButton_overIcon")]
  13. public var rbOverSkin: Class;
  14. }
  15. }

复制代码

译者注:上面代码需要用 mxmlc 编译,不用使用 Flex Builder 去建项目。

第二步:将这个外壳 SWF 放到服务器上
Flex 程序需要从某个地方加载皮肤呀。

第三步:在 Flex 程序中使用 Loader 加载外壳 SWF
我建了一个比较实用的类 ClassLoader 来加载 SWF 文件,并且将其转化为类。以下是一些关键行:

  1. loader = new Loader();
  2. loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
  3. loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
  4. loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
  5. ...
  6. request = new URLRequest(swfLib);
  7. var context:LoaderContext = new LoaderContext();
  8. context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
  9. loader.load(request, context);

复制代码

第四步:从加载的 SWF 中生成类,然后实例化

  1. var wrapperClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition(className) as Class;
  2. var wrapper:Object = new wrapperClass();

复制代码

第五步:利用 setStyle 应用皮肤
这个很简单了。

  1. StyleManager.getStyleDeclaration("Button").setStyle("upSkin", wrapper.rbUpSkin);
  2. StyleManager.getStyleDeclaration("Button").setStyle("downSkin", wrapper.rbDownSkin);
  3. StyleManager.getStyleDeclaration("Button").setStyle("disabledSkin", wrapper.rbDisabledSkin);
  4. StyleManager.getStyleDeclaration("Button").setStyle("overSkin", wrapper.rbOverSkin);

复制代码

第六步:运行 程序

那么为什么要这么做呢?动态的皮肤提供给你一个难以置信而格外有力的功能 :你可以让你的用户在你的程序上使用他们自己的皮肤。想象一下一个像 Winamp 的 Flex Mp3 播放器。开发人员并不需要为程序建立一个皮肤库,任何人都可以发布一个 UI 通过设置 皮肤 SWF (可能在一个配置窗口中)让用户选择任一在社区中提供的皮肤。同样重要的,开发者 也有能力来控制哪个皮肤可以被替换,哪个皮肤只能使用原来的皮肤(仅仅对相应的控件调用 setStyle 即可)。最后,将皮肤放到程序的外面,可以有效的保持程序的体积不会太大,肯定要比包含皮肤时要小。

Flex中实时动态加载(图像swf)皮肤的方法相关推荐

  1. 网络游戏程序中解决加载卡顿的有效方法

    对于3d视频游戏来说,游戏引擎的性能是至关重要的.玩家在体验一款游戏时,游戏的流畅度是最基本的要求.与单机游戏不同,网络游戏更需要考虑性能问题,因为无法像单机游戏那样,控制游戏元素的复杂度来达到效率的 ...

  2. php 扩展加载顺序,关于PHP中extension加载顺序问题的解决方法

    有的php扩展,加载是有先后顺序的,如果搞错了,会导致扩展无法加载. 1.pdo_sqlsrv是sqlserver扩展,如果在pdo扩展之前加载就会报以下错误:PHP Warning: PHP Sta ...

  3. 用jQuery预加载图像

    我正在寻找一种快速简单的方法来用JavaScript预加载图像. 如果重要的话,我正在使用jQuery. 我在这里( http://nettuts.com ... )看到了: function com ...

  4. 在VC中动态加载ODBC的方法

    在VC中动态加载ODBC的方法     在使用VC.VB.Delphi等高级语言编写数据库应用程序时,往往需要用户自己在控制面板中配置ODBC数据源.对于一般用户而言,配置ODBC数据源可能是一件比较 ...

  5. web高德地图怎么加载离线地图_基于 QGIS 在内网中离线加载卫星地图的方法

    1. 概述 我们之前为大家分享过在三维地球开源平台离线加载卫星影像的方法,主要包括基于桌面端的OsgEarth开源三维地球和基于Web端的Cesium开源三维地球等平台的局域网离线影像加载. 另外,也 ...

  6. 基于 QGIS 在内网中离线加载卫星地图的方法

    1. 概述 我们之前为大家分享过在三维地球开源平台离线加载卫星影像的方法,主要包括基于桌面端的OsgEarth开源三维地球和基于Web端的Cesium开源三维地球等平台的局域网离线影像加载. 另外,也 ...

  7. python使用openCV加载图像、并将BGR格式转换成HSV格式、定义HSV格式中需要分离颜色的掩码(掩模)区间(mask)、并使用mask信息进行颜色分离、BGR格式的图像转化为RGB、并可视化

    python使用openCV加载图像.并将BGR格式转换成HSV格式.定义HSV格式中需要分离颜色的掩码(掩模)区间(mask).并使用mask信息进行颜色分离.将BGR格式的图像转化为RGB.可视化 ...

  8. flash AS3.0访问加载的SWF文件中的属性、方法以及类、库中的影片剪辑

    对于FLASH,我们可以把任何的可视化元件都看成某个类文件的具体实例,包括swf文件. 我们可以把swf文件看成一个类的具体实例,而它里面拥有个个其他类的实例对象,例如: 我们新建一个loaded.f ...

  9. go语言html css,html – 在Golang中加载图像和CSS

    我在项目根目录的package main中的server.js中设置了一个路由 http.HandleFunc( "/",route.IndexHandler) IndexHand ...

最新文章

  1. bat maven 一键打包1.0
  2. Java Semaphore实现线程池任务调度
  3. vs2015下载 简体中文版/企业版 附邀请码
  4. 某八位微型计算机地址为20位,微机原理作业及参考答案
  5. 生产级部署 Python 脚本,崩溃可自启!
  6. [数据加密]GIS空间数据水印信息隐藏与加密技术方法[转]
  7. 启明云端分享|直接用ESP32-S2和ESP32-C3驱动1.54寸串口屏,有哪些区别呢,他们的亮点又有哪些呢
  8. cmd弄电脑滚绿代码_windows10点击“此电脑”——“管理”会出现管理员已阻止你运行此应用。有关详细信息。。。...
  9. NGINX 配置超时时间
  10. 计算机组成原理题集,计算机组成原理试题集含答案
  11. 桑佛德大学计算机科学,美国桑佛德大学专业都有哪些?每个专业都有什么优势?一起来了解下吧?...
  12. ORA-01790 expression must have same datatype as corresponding expression 问题解决
  13. 3DMAX渲染完卡住不动该怎么办?
  14. 用Notepad++实现文本比较
  15. 【精选】表情包斗图小程序(可引流,开通流量主,权益外卖cps,带pc后台管理)
  16. Python爬虫--Selenium模拟用户的键盘鼠标操作
  17. 数字电路基础知识——格雷码和二进制码的转换的算法和Verilog实现
  18. Redis的集群配置
  19. “对立论”主要着眼于人工智能技术与人类权利和福祉之间的对立冲突
  20. 工作3年,看啥资料能月薪30K?

热门文章

  1. 年味儿一年不如一年图鉴
  2. linux内核cache使无效,linux内核之bcache简介
  3. 完全图(二分,图论)
  4. 【Verilog刷题篇】硬件工程师从0到入门2|组合逻辑
  5. 机器学习-朴素贝叶斯
  6. Centos网络编程之tcp十一种状态及问题处理办法
  7. 使用数据库邮件发送会议邀请
  8. 快速扫描局域网主机的方式
  9. 服务器回环地址修改,服务器回环地址修改
  10. Maven打包问题:repackage failed: Unable to rename解决