本文来源于 冰山上的播客 http://xinsync.xju.edu.cn , 原文地址:http://xinsync.xju.edu.cn/index.php/archives/1953
现在有许多关于如何为Flex程序加上皮肤的很好的资料。简单来说:Flex支持两种加载皮肤的方法:graphical和programmatic。graphical方法是在Flash,Photoshop,Fireworks等工具中创建图形资源,并把他们嵌入到你的Flex程序中。programmatic方法是创建一个为控件定义skin的ActionScript类。正如你猜测的那样,graphical方法比较简单,programmatic方法则比较强大。
这两种方法共同的一个缺点就是:为了能应用skin这些资源(graphical方法中的SWF/PNG/GIF/其他, programmatic方法中的AS类)都必须在编译时就是可用的。必须如此吗?在这篇文章中我将介绍一个巧妙的方法让graphical skins在运行时加载(通过一个带有源代码的示例)。
为了让这个例子尽量简单,我将创建一个允许Button控件动态加载皮肤的Flex程序。这个程序将在运行时连接到一个SWF,加载皮肤并且把它应用到Button控件。为了使它简单我将使用NJ文章中提供的皮肤模板文件,把RadioButton皮肤应用到Button控件。
第一步:为skin资源创建一个wrapper SWF
Skin资源在上述的skin模板文件中。我希望创建一个Flex程序可以在运行时加载并且可以从中提取适当资源的wrapper SWF,在这个例子中它就是RadioButton控件的四个symbol。下面是源码:
package
{
import flash.display.Sprite;
public class Wrapper extends Sprite
{
[Embed(source=”flex_skins.swf”,symbol=”RadioButton_upIcon”)]
public var rbUpSkin: Class;
[Embed(source=”flex_skins.swf”,symbol=”RadioButton_downIcon”)]
public var rbDownSkin: Class;
[Embed(source=”flex_skins.swf”,symbol=”RadioButton_disabledIcon”)]
public var rbDisabledSkin: Class;
[Embed(source=”flex_skins.swf”,symbol=”RadioButton_overIcon”)]
public var rbOverSkin: Class;
}
}
第二步:把这个wrapper SWF放到你的服务器上
Flex程序需要从一个地方加载这个wrapper SWF!
第三步:在你的Flex程序中,使用Loader来加载这个wrapper SWF
我创建了一个叫做ClassLoader的有用的类来包装与加载SWF有关的功能并提取了这个类。下面是关键代码:
loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
…
request = new URLRequest(swfLib);
var context:LoaderContext = new LoaderContext();
context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
loader.load(request, context);
注意这个Loader把SWF加载到了一个ApplicationDomain中,当前的domain是它的parent。这是保证程序可以访问加载的类以及其中的资源的关键。
第四步:从加载的SWF中获得类并将它实例化。
这里我们使用一个一致的类名(这个例子中,是“Wrapper”)来加载类:
var wrapperClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition(className) as Class;
var wrapper:Object = new wrapperClass();
第五步:使用setStyle应用skins
你可以把skins应用到一个Button实例或者Button的所有实例。下面是方法:
StyleManager.getStyleDeclaration(”Button”).setStyle(”upSkin”, wrapper.rbUpSkin);
StyleManager.getStyleDeclaration(”Button”).setStyle(”downSkin”, wrapper.rbDownSkin);
StyleManager.getStyleDeclaration(”Button”).setStyle(”disabledSkin”, wrapper.rbDisabledSkin);
StyleManager.getStyleDeclaration(”Button”).setStyle(”overSkin”, wrapper.rbOverSkin);
第六步:运行程序
我的例程(点击这里察看,可以“View Source”)展示了一个文本域,你可以向其中你输入wrapper SWF的URL(点击这里)。输入wrapper SWF的URL,点击Apply按钮,你会看到按钮现在看起来像一个特大型的单选按钮。当你将鼠标放在上面或者点击它的时候,你会发现它的外观会改变并显示适当的skin。如果你创建了自己的wrapper SWF并且其中包含了具有相同类名(rbUpSkin,等)的不同symbols,你可以把这个例程指向并加载它,从而显示不同的skins集合。
为什么你想要这样做呢?动态加载skin提供了一个难以置信的强大的功能:你可以让你的用户把他们的skin加载到你的程序中。想象一下一个用Flex创建的像Winamp一样的MP3播放器吧。开发者不需要为这个程序创建一个skin库,他只需要公布一个设置skin SWF(比如在参数对话框中)的UI并且让用户从一些团体创建的skin中任意选择。同样重要的是,开发者可以很精确地控制哪些控件可以加载skin那些需要保持原样(只在需要的控件上调用setStyle)。最后,把skins放在程序SWF外部将使得程序文件的大小不会因为skin文件的扩散而急速增加。
分享到:
相关推荐
FlexSkin是一款广泛应用于软件开发中的皮肤库,尤其在创建具有美观界面的桌面应用程序时非常受欢迎。天蓝色皮肤是FlexSkin库中的一个特定主题,它为用户提供了一种清新、舒缓的视觉体验,常用于给软件界面增添现代感...
- 要实现类似QQ的皮肤效果,首先需要引入皮肤库,比如 popular 的 TMS Skin VCL 或 TMS FlexSkin。这些库提供了丰富的皮肤资源和方便的皮肤应用接口。 - 使用 SkinManager 组件管理皮肤,通过 SkinName 属性设置所...
基于springboot个人公务员考试管理系统源码数据库文档.zip
bimdata_api_client-4.2.1-py3-none-any.whl
numpy-1.20.2-cp39-cp39-linux_armv7l.whl
matplotlib-3.3.2-cp39-cp39-linux_armv7l.whl
bimdata_api_client-4.0.0-py3-none-any.whl
ta_lib-0.5.1-cp312-cp312-win32.whl
基于springboot的非学勿扰学习交流平台源码数据库文档.zip
基于springboot云平台的信息安全攻防实训平台源码数据库文档.zip
pillow-10.4.0-cp311-cp311-linux_armv7l.whl
论文描述:该论文研究了某一特定领域的问题,并提出了新的解决方案。论文首先对问题进行了详细的分析和理解,并对已有的研究成果进行了综述。然后,论文提出了一种全新的解决方案,包括算法、模型或方法。在整个研究过程中,论文使用了合适的实验设计和数据集,并进行了充分的实验验证。最后,论文对解决方案的性能进行了全面的评估和分析,并提出了进一步的研究方向。 源码内容描述:该源码实现了论文中提出的新的解决方案。源码中包含了算法、模型或方法的具体实现代码,以及相关的数据预处理、实验设计和性能评估代码。源码中还包括了合适的注释和文档,以方便其他研究者理解和使用。源码的实现应该具有可读性、可维护性和高效性,并能够复现论文中的实验结果。此外,源码还应该尽可能具有通用性,以便在其他类似问题上进行进一步的应用和扩展。
基于springboot+web的学生作业管理系统源码数据库文档.zip
论文描述:该论文研究了某一特定领域的问题,并提出了新的解决方案。论文首先对问题进行了详细的分析和理解,并对已有的研究成果进行了综述。然后,论文提出了一种全新的解决方案,包括算法、模型或方法。在整个研究过程中,论文使用了合适的实验设计和数据集,并进行了充分的实验验证。最后,论文对解决方案的性能进行了全面的评估和分析,并提出了进一步的研究方向。 源码内容描述:该源码实现了论文中提出的新的解决方案。源码中包含了算法、模型或方法的具体实现代码,以及相关的数据预处理、实验设计和性能评估代码。源码中还包括了合适的注释和文档,以方便其他研究者理解和使用。源码的实现应该具有可读性、可维护性和高效性,并能够复现论文中的实验结果。此外,源码还应该尽可能具有通用性,以便在其他类似问题上进行进一步的应用和扩展。
基于springboot网上书店源码数据库文档.zip
numpy-2.1.3-cp311-cp311-linux_armv7l.whl
基于springboot的校园消费点评系统源码数据库文档.zip
ta_lib-0.5.1-cp37-cp37m-win32.whl
Java高校学生信息管理系统源码 一、源码介绍 高校学生信息管理系统设计主要应用JAVA语言编程和mysql数据库连接等相关知识,需要熟练掌握Struts2、Spring、Hibernate基础 二、主要功能 高校学生信息管理系统设计主要应用JAVA语言编程和mysql数据库连接等相关知识,需要熟练掌握Struts2、Spring、Hibernate基础,将所 学知识在生活中灵活运用,高校学生信息管理系统的主要设计功能如下: (1)学生信息管理模块:包括所有学生信息的查询(用分页列表显示)、查看某个学生的详细信息、删除某学生信息、修改某学生信息以及学生信息的录入等子功能 (2)学生成绩管理模块:包括成绩信息录入、学生成绩查询、查看某个学生的成绩表以及删除学生
opencv_python-4.4.0.42-cp39-cp39-linux_armv7l.whl