`
bigt
  • 浏览: 45418 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Flex4 对 View State 管理的增强

 
阅读更多

[原文出处: http://swfever.com/?p=717]

本章我们将介绍Flex 4中其他与视图状态相关的新特性和变化,包括:

  • 控制组件的创建和销毁
  • 状态组
  • Base State
  • <fx:Reparent>标签

 

控制组件的创建和销毁

上一章登录/注册对话框的例子中,当我们将视图状态切换到register时,会需要创建一个额外的Label组件和TextInput组件作为密码确认的输入框,当切换回login状态时,这些组件又将不再显示。这就引发了两个问题:

  • 何时创建那些只在某些特定状态出现的组件?
  • 当某个组件不出现在当前状态中时,是否需要销毁该组件?

事实上,这两个问题的答案都取决于开发者的需求。如果我们选择初始化阶段创建所有组件,那么在状态切换时,你会获得更短的响应时间,但是会增加不必要的内存占用。如果你选择只在需要时创建组件并在不需要时将其销毁,那么内存占用会更加合理,但是相应地,你需要更多的响应时间来完成创建和销毁组件的工作。

无论如何,Flex 4提供了非常简便的方式来满足你的需求:

控制组件的创建时机 - itemCreationPolicy属性

  • deffered (默认) – 直至切换到包含当前组件的状态时才创建
  • immediate – 立即创建组件,而不管当前的状态如何

控制组件的销毁时机 - itemDestructionPolicy属性

  • never (默认) - 组件一旦创建就不会被自动销毁
  • auto – 当离开包含该组件的状态时,组件将被自动销毁

可以看到,Flex 4默认的处理方式为:直到组件被需要时(切换到指定状态)才被创建,但一旦被创建后就不会被销毁。你可以根据自己的需要来改变创建和销毁的机制,例如:

<s:states>
    <s:State name="login"/>
    <s:State name="register"/>
</s:states>
<s:Panel>
    <s:TextInput id="confirmInput" includeIn="register" 
        itemCreationPolicy="immediate" itemDestructionPolicy="auto" />
</s:Panel>

在上面的例子中,尽管默认状态为login,但是confirmInput仍然会在整个MXML组件构造初期就被创建,但是当从login状态切换至register在切换回login状态时,confirmInput所引用的对象将会被销毁。如果再次切换至register状态,一个新的TextInput组件会被创建,但是confirmInput将始终为null。

需要注意的是,itemCreationPolicy,itemDestructionPolicy以及上一章中介绍的includeIn和excludeFrom,都是MXML特有属性(即XML Attributes),和组件属性(Properties)不同。只有当你使用MXML 2009时,才能够使用这些属性。

状态组 (State Group)

状态组是一个非常有用的新特性。当组件定义的状态比较多的时候,我们可能希望将针对某几种状态做统一的设置。例如,ToggleButton组件定义了如下状态:

  • up
  • over
  • down
  • disabled
  • upAndSelected
  • overAndSelected
  • downAndSelected
  • disabledAndSelected

我们可能会经常有这样的需求:“对于所有的over状态(over或overAndSelected),我希望按钮标签颜色为红色”,或者“对于所有selected状态,我希望按钮的字体为粗体”。可以想象,满足这样的需求需要很繁复的工作,你不得不为每一个selected有关的状态设置粗体或者为每一个与over有关的状态设置颜色。但是,有了状态组的支持,你可以各种状态按照你的需求自由的组织起来。

状态组的基本原则是:一个状态组可以包含多个状态,一个状态可以隶属于多个状态组。也就是说,这是一个多对多的映射,你可以根据需要随意组织。例如,为了满足上面提到的两个需求,我们可以将ToggleButton的状态用两个状态组组织起来:

<s:states>
    <s:State name="up" />
    <s:State name="over" stateGroups="overStates" />
    <s:State name="down" />
    <s:State name="disabled"/>
    <s:State name="upAndSelected" stateGroups="selectedStates" />
    <s:State name="overAndSelected" stateGroups="selectedStates, overStates" />
    <s:State name="downAndSelected" stateGroups="selectedStates" />
    <s:State name="disabledAndSelected" stateGroups="selectedStates" />
</s:states>

可以看到,我们一共定义了两个状态组:overStates和selectedStates。前者包含了所有与over有关的状态,而后者则包含了所有与selected有关的状态。接下来的事情就变得简单了,我可以通过下面的语句来设置按钮标签的颜色和字体:

<s:Label id="label" color.overStates="Red" fontWeight.selectedStates="bold" />

Base State

在Flex 4 (MXML 2009)中,我们取消了原有的默认状态“Base State”,起始状态默认情况下为第一个被显式定义的状态。这一点也可以从Flash Builder的设计视图中看到:
FlashBuilder4_State_View

<fx:Reparent>标签

Reparent标签必须和includeIn或excludeFrom一起使用。它相当于一个占位符,当切换到包含该标签的状态时,Reparent标签的位置会被其指定的目标对象(target)所代替,从而达到对组件在特定状态下重新定位的效果。例如:

<s:states>
    <s:State name="state1" />
    <s:State name="state2" />
</s:states>
 
<s:Group id="group1">
    <s:Button id="button" includeIn="state1" />
</s:Group>
 
<s:Group id="group2" x="200">
    <fx:Reparent target="button" includeIn="state2"/>		
</s:Group>

在上面的例子中,当状态从state1切换到state2时,button组件会从group1中移除,并被添加到的group2中。

虽然标签的名字叫做“Re-parent”,但是并不意味着该标签必须出现在与目标组件不同的父级中,你也可以在与目标相同的父级容器中使用该标签,例如:

<s:states>
    <s:State name="state1" />
    <s:State name="state2" />
</s:states>
 
<s:Group>
    <s:Button id="button1" includeIn="state1" />
    <s:Button id="button2"/>
    <fx:Reparent target="button1" includeIn="state2"/>
</s:Group>

在上面例子中,当状态切换到state2时,button1和button2的遮盖顺序会颠倒过来。你可以发挥你的想象力去挖掘这个标签的潜在用途。

分享到:
评论

相关推荐

    flex-最简单的state对象控制

    该主题主要涉及如何通过Flex框架中的State管理机制来实现不同界面状态之间的切换。以下将围绕标题、描述以及部分代码内容进行深入解析。 ### 标题:Flex中最简单的State对象控制 这个标题表明了文章的主要讨论点...

    Flex使用视图状态(View States)笔记

    ### Flex使用视图状态(View States)笔记 #### 视图状态概述 视图状态(View States,简称VS)是Adobe Flex框架中一个非常实用的功能,它允许开发者根据用户的交互或程序的状态来动态地更改界面元素的外观和行为。...

    android获取网络状态Flex开发

    Flex4.5版本进一步增强了对移动设备的支持,特别是在Android设备上,提供了强大的工具和API来构建原生级的应用体验。Flex可以跨平台运行,不仅限于Android,还包括iOS和其他操作系统,这使得开发者能够使用相同的...

    Flex4之控制状态转换以及产生动画特效【登录示例】

    通过以上实例,我们不仅学习了如何使用Flex4实现复杂的动画效果,还掌握了状态管理和动画控制的基本方法。这些技能对于开发高质量的RIA应用程序至关重要。在未来的工作中,可以根据具体需求灵活运用这些技术,创建...

    FLEX数据传输与交互

    3. State管理:FLEX支持状态管理,允许为不同的应用场景定义不同的视图状态。这在实现复杂的用户交互和动态界面时非常有用。 五、事件驱动编程 FLEX是事件驱动的,所有的用户交互和网络通信都以事件的形式进行。...

    Flex前台分页

    7. **状态管理(State Management)**:在用户切换页面时,确保应用程序状态正确保存和恢复。这可能涉及到使用Flex的states或者自定义的逻辑来管理当前页数和其他相关变量。 8. **自定义组件(Custom Components)*...

    flex quick starts

    Adobe Flex 提供了一种非常实用的方法来管理这些界面变化——**视图状态**(View States)。通过视图状态,开发者能够轻松地为组件定义多种不同的视图,并且可以在这些视图之间进行平滑过渡,从而提高用户体验的同时...

    Flex 3 组件实例与应用(2009版)

    通过以上对《Flex 3 组件实例与应用》一书中提到的各类组件的介绍,我们可以看出Flex 3提供的组件不仅涵盖了基本的UI需求,还包括了高级的交互、数据展示和验证等功能。这使得开发者能够在构建复杂的应用程序时更加...

    网络解析Httpery

    flex: 1, justifyContent: "center", alignItems: "center", backgroundColor: "#F5FCFF" }, welcome: { fontSize: 20, textAlign: "center", margin: 10 }, instructions: { textAlign: "center", ...

    皮肤制作文档

    以下是对该文档所包含的重要知识点进行详细解析: ### 1. 皮肤(Skin)简介 在Adobe Flex中,皮肤是用于定义组件外观的一种机制,它允许开发者定制用户界面的视觉效果。通过使用皮肤,可以轻松更改应用程序的外观...

    2015年7月18日oschina 杭州分享 React-Native开发原生iOSApp携程vczero.ppt

    `props`用于传递属性到子组件,`state`保存组件内部状态,而`ref`则提供对组件实例的引用,便于访问和操作。基本组件包括`Text`、`Image`、`View`、`NavigatorIOS`、`ScrollView`、`TabBarIOS`、`TextInput`、`...

    FlexGraphics_V_1.79_D4-XE10.2_Downloadly.ir

    - ADD: Delphi/CBuilder XE4 now supported. - ADD: Delphi/CBuilder XE3 now supported. - ADD: Delphi/CBuilder XE2 now supported. - ADD: Delphi/CBuilder XE now supported. - ADD: Delphi/CBuilder 2010 now ...

    基于SOA和ROA的整体技术架构(doc 11页).docx

    在J2EE架构下,Struts、Spring、Hibernate等开源框架提供了对MVC模式的支持,简化了业务逻辑和数据访问的实现,增强了应用程序的灵活性和可维护性。 综上所述,基于SOA和ROA的整体技术架构结合了服务的灵活性和资源...

    一个ReactNative仿网易新闻的Demo

    - Flexbox布局:React Native使用Flexbox模型进行布局管理,类似于CSS中的Flex布局,适用于创建复杂的、响应式的用户界面。 - Style对象:样式通过JavaScript对象定义,支持内联样式和类样式,与CSS有较大的区别。...

    Symfony4-REST-API

    它遵循MVC(Model-View-Controller)设计模式,提供了一套全面的开发工具和库,如路由、表单处理、安全控制、缓存管理等。Symfony 4着重于简洁和速度,引入了Flex,这是一个新的 Composer 插件,使得项目配置更加...

    pureMvc AS3 10个有代表性的官方例子源代码。

    4. **Multiton**: 展示了如何使用Multiton模式来管理全局的单例服务,比如配置信息或数据库连接。 5. **MacroCommand**: 介绍MacroCommand的概念,一种可以组合多个子命令的命令,便于处理复杂的业务流程。 6. **...

    前端简历模块,前端开发

    - **MVVM模式**:Model-View-ViewModel架构模式,是Vue的核心思想,它连接了视图和数据模型。 - **Object.defineProperty**:Vue的响应式原理,用于监听和拦截对象属性的读写,实现数据变化时视图的自动更新。 - ...

    React Native之TextInput组件解析示例

    本文将对TextInput组件进行详细的解析,并提供一个实用的示例来帮助读者更好地理解和使用TextInput组件。 概述 TextInput组件和Text组件类似,内部都没有使用FlexBox布局,不同的是TextInput组件支持文字的输入,...

    Vuejs写一个移动端新闻

    安装Vuex(`npm install vuex`),然后在`src/store`目录下创建`index.js`文件,定义state、mutations、actions等。 8. **响应式数据绑定**: Vue.js的双括号`{{ }}`用于插值表达式,将数据绑定到DOM元素。例如,`{...

    设置TabNavigator组件的标签头的自定义皮肤

    然而,为了使应用更符合品牌形象或用户界面设计,我们往往需要对这些默认样式进行调整,这就涉及到自定义皮肤的设置。 在React Navigation中,我们可以使用`tabBarOptions`属性来定制标签头的外观。这个属性允许...

Global site tag (gtag.js) - Google Analytics