实时加载 Flex 皮肤

本文介绍了一种在Flex程序中实时加载皮肤的方法。通过创建SWF外壳文件并利用Loader类加载,实现了动态更改按钮皮肤的功能。这不仅简化了皮肤更换过程,还允许用户使用自定义皮肤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

文中需要的资源文件列在下面:

皮肤模板
wrapper swf
例子
源码


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

第一步:为皮肤资源建立一个外壳 SWF
目的,有了这个外壳 SWF,我的 Flex 程序就可以实时加载皮肤中适当的资源
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;
  }
}
译者注:上面代码需要用 mxmlc 编译,不用使用 Flex Builder 去建项目。

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

第三步:在 Flex 程序中使用 Loader 加载外壳 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);

第四步:从加载的 SWF 中生成类,然后实例化
var wrapperClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition(className) as Class;
var wrapper:Object = new wrapperClass();

第五步:利用 setStyle 应用皮肤
这个很简单了。
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);

第六步:运行程序

那么为什么要这么做呢?动态的皮肤提供给你一个难以置信而格外有力的功能:你可以让你的用户在你的程序上使用他们自己的皮肤。想象一下一个像 Winamp 的 Flex Mp3 播放器。开发人员并不需要为程序建立一个皮肤库,任何人都可以发布一个 UI 通过设置皮肤 SWF (可能在一个配置窗口中)让用户选择任一在社区中提供的皮肤。同样重要的,开发者也有能力来控制哪个皮肤可以被替换,哪个皮肤只能使用原来的皮肤(仅仅对相应的控件调用 setStyle 即可)。最后,将皮肤放到程序的外面,可以有效的保持程序的体积不会太大,肯定要比包含皮肤时要小。
Slobber的BLOG支持一下。
内容概要:该论文聚焦于T2WI核磁共振图像超分辨率问题,提出了一种利用T1WI模态作为辅助信息的跨模态解决方案。其主要贡献包括:提出基于高频信息约束的网络框架,通过主干特征提取分支和高频结构先验建模分支结合Transformer模块和注意力机制有效重建高频细节;设计渐进式特征匹配融合框架,采用多阶段相似特征匹配算法提高匹配鲁棒性;引入模型量化技术降低推理资源需求。实验结果表明,该方法不仅提高了超分辨率性能,还保持了图像质量。 适合人群:从事医学图像处理、计算机视觉领域的研究人员和工程师,尤其是对核磁共振图像超分辨率感兴趣的学者和技术开发者。 使用场景及目标:①适用于需要提升T2WI核磁共振图像分辨率的应用场景;②目标是通过跨模态信息融合提高图像质量,解决传统单模态方法难以克服的高频细节丢失问题;③为临床诊断提供更高质量的影像资料,帮助医生更准确地识别病灶。 其他说明:论文不仅提供了详细的网络架构设计与实现代码,还深入探讨了跨模态噪声的本质、高频信息约束的实现方式以及渐进式特征匹配的具体过程。此外,作者还对模型进行了量化处理,使得该方法可以在资源受限环境下高效运行。阅读时应重点关注论文中提到的技术创新点及其背后的原理,理解如何通过跨模态信息融合提升图像重建效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

游鱼_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值