`
lan13217
  • 浏览: 496293 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

flex4里的的状态(State)

    博客分类:
  • FLEX
阅读更多

什么是状态(States)?

在很多富互联网应用,网页外观的改变基于用户的行为。一个状态就定义了组件的一种表现样式。要想使用状态,你应该首先定义一个默认的状态,然后在此基础上重写或者更改,这样就形成了一系列的其他样式。你可以添加、移除某些子元素,更改CSS或者属性的值,更改触发的事件。这些如何做到,我们会一一介绍。

下面我们先通过一个例子大概看一下如何使用State。
下面这段代码呈现的首先是一个登陆的界面,当你单击注册的链接,它就会变成一个注册界面。它是新的界面但不是新的页面。通过浏览器的后退按钮你是回不到原来的状态的。当然,我们也会有办法实现这个功能,以后会介绍。

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/halo" minWidth="1024" minHeight="768">
<s:layout>
<s:BasicLayout/>
</s:layout>

<s:states>
<s:State name="default"/>
<s:State name="Register"/>
</s:states>

<!-- Set title of the Panel container based on the view state.-->
<s:Panel id="loginPanel"
title="Login" title.Register="Register">
<s:layout>
<s:VerticalLayout/>
</s:layout>
<mx:Form id="loginForm">
<mx:FormItem label="Username:">
<s:TextInput/>
</mx:FormItem>
<mx:FormItem label="Password:">
<s:TextInput/>
</mx:FormItem>
<mx:FormItem id="confirm" label="Confirm:" includeIn="Register">
<!-- Add a TextInput control to the form for the Register view state. -->
<s:TextInput/>
</mx:FormItem>
<mx:FormItem direction="horizontal">
<!-- Use the LinkButton to change view state.-->
<mx:Spacer width="100%" id="spacer1"/>
<!-- Set label of the control based on the view state.-->
<mx:LinkButton id="registerLink"
label="Need to Register?"
label.Register="Return to Login"
click="currentState='Register'"
click.Register="currentState=''"/>
<s:Button id="loginButton"
label="Login" label.Register="Register"/>
</mx:FormItem>
</mx:Form>
</s:Panel>
</s:Application>

 

定义状态

flex4里状态的定义与flex3不同,你只需在<states></states>标签内定义状态就可以了。添加子元素和设置属性之类,不在这里进行了。如下所示: 

<s:states>
<s:State name="State1"/>
<s:State name="State2"/>
<s:State name="State3"/>
.
.
</s:states>

改变状态

UIComponent类定义了一个currentState属性,通过改变这个属性的值来更换状态,这个属性的默认值是定义在需在<states></states>标签内的第一个状态。例如:

<s:Button id="b1" label="Change to State 1" click="currentState='State2';"/>
<s:Button id="b2" label="Change to the default" click="currentState='State1';"/>

当然也可以通过UIComponent类的setCurrentState方法。

 

为一个状态设定属性,样式和事件

这是与flex3很不同的地方。在flex4里通过点语法来设定一个组件属于某个状态的属性值。例如:

<s:Button label="Default State" label.State2="New State"/>

上述的代码的意思是,这个按钮的lable值在State2状态下是New State,在其他状态下是Default State。
上述代码也可以这样写:

<s:Button >
<s:label>Default State</s:label>
<s:label.State2>new State</s:label.State2>
</s:Button>

要想在某个状态里清除某个属性的值,可以让属性值等于@clear。如下:

<Button color="0xFF0000" color.State1="@Clear"/>

对于事件也一样可以用点语法,例如:

<s:Button id="b1" label="Click Me"
click="ta1.text='hello';"
click.State1="ta1.text='goodbye'"/>

 

添加或移除组件

在flex4里,添加或移除某个组件,直接在这组件的属性里搞定。组件多了两个属性,includeIn和excludeFrom。includeIn,表示这个组件要被添加到属性值所指的状态,excludeFrom,表示这个组件要从属性值所指的状态中删除,includeIn和excludeFrom不能在同一个组件标签里出现,他们的值可以是多个状态,之间用逗号隔开。例如:

<s:states>
<s:State name="default"/>
<s:State name="addCheckBox"/>
<s:State name="addTextInput"/>
<s:State name="addCheckBoxandButton"/>
</s:states>

<s:CheckBox id="myCB" label="Checkbox"
includeIn="addCheckBox, addCheckBoxandButton"/>

<s:TextArea text="Exclude from addTextInput"
excludeFrom="addTextInput"/>

更改一个组件的父元素

一个组件的父元素也能变,你信吗?不过flex4真的做到了。用的就是这个<fx:Reparent>标签。还是看段代码吧!

<?xml version="1.0" encoding="utf-8"?>
<!-- states\NewStatesReparent.mxml -->
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/halo"
xmlns:s="library://ns.adobe.com/flex/spark">
<s:layout>
<s:VerticalLayout/>
</s:layout>
<s:states>
<s:State name="Parent1"/>
<s:State name="Parent2"/>
</s:states>
<s:HGroup>
<s:Panel id="Panel1"
height="100" width="100"
title="Panel 1">
<s:Button id="setCB" includeIn="Parent1"/>
</s:Panel>
<s:Panel id="Panel2"
height="100" width="100"
title="Panel 2">
<fx:Reparent target="setCB" includeIn="Parent2"/>
</s:Panel>
</s:HGroup>
<s:HGroup>
<s:Button label="Parent 1"
click="currentState='Parent1'"
enabled.Parent1="false"/>
<s:Button label="Parent 2"
click="currentState='Parent2'"
enabled.Parent2="false"/>
</s:HGroup>
</s:Application>

这句话:<fx:Reparent target="setCB" includeIn="Parent2"/>什么意思呢?target的值setCB,就是我们要换父亲的组件就是setCB,看上面代码,你看它在哪里?setCB是第一个panel的Button的id吧!当转换到状态Parent2时,这个Button就成了第二个Panle的子元素。因为includeIn="Parent2"告诉我们了,在状态Parent2时,就要换了setCB的父元素,换成fx:Reparent的父元素,即第二个panel。

 

添加子元素时的控制

或许,你有这样的疑问。我为某个状态添加了一个子元素,这个元素在原来的状态是不存在的,至少,你看不见。那么,这个子元素时是在程序一运行时就被创建了还是在切换状态时才创建呢?
flex4的答案是在第一次换到需要这个子元素出现的状态时,它被创建。这是默认的情况。但是,如果这个子元素的创建需要很长时间,那么用户肯定在切换状态时感到延迟,这是不好的。所以,默认的情况,可以改。通过更改itemCreationPolicy,这是组件的一个属性,它有两个值:deferred,默认值,意思是在第一次需要这个组件出现时创建; immediate,它是在程序一被启动就会创建这个子元素。
一旦子元素被创建了,它就会一直存在了。

界面的改变不是仅仅只能通过State。通过导航器,如:Accordion,Tab Navigator,ViewStack containers你也能做到。到底用哪个,取决于你的应用需求以及用户界面的设计。

创建状态组

在flex4里,可以给状态分组,比如第一个状态和第二个状态是一组,第三个状态和第四个状态是一组等等。我们先看怎么分组?

<s:State name="default"/>
<s:State name="addCheckBox" stateGroups="Group1"/>
<s:State name="addTextInput"/>
<s:State name="addCheckBoxandButton" stateGroups="Group1"/>

只需添加一个stateGrooups这个属性。
添加分组的好处是什么呢?

如果一个组件在多个状态中出现,你就可以把这些状态划分到一组。那么,当出现这个族里任何一个状态时,这个组件的设置都会有效。点语法后面的值可以是组的名称,excludeFrom和includeIn的值也可以使组的名称。 

 

 

后续还会写些有关改变状态所触发的事件和实现让浏览器的前进后退按钮切换状态的功能的问题。 

 

与状态有关的事件

下面接收4个与状态有关的事件:

  • enterState:进入一个新状态后触发,触发者是state object和组件。
  • exitState:一个状态将要离开时触发,触发者是state object和组件。
  • currentStateChanging:在状态即将改变时触发。它被一个currentState属性值改变的组件触发。你可以利用这个事件向服务器请求即将被新状态用到的数据。
  • currentStateChange:在一个状态已经完全改变了后触发。你可以利用这个事件向服务器发回一个数据,指明用户当前的状态。
看个实例好了!
<?xml version="1.0"?>
<!-- states\StatesSimpleEvent.mxml -->
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/halo"
xmlns:s="library://ns.adobe.com/flex/spark">
<s:states>
<!-- Define the new view states. -->
<s:State name="default"
enterState="MyEnterTA.text = 'Enter state: default';"
exitState="MyExitTA.text = 'Exit state: default';"/>
<s:State name="NewButton"
enterState="MyEnterTA.text = 'Enter state: NewButton';"
exitState="MyExitTA.text = 'Exit state: NewButton';"/>
</s:states>
<s:VGroup id="g1">
<s:HGroup>
<s:Button id="b1" label="Click Me"
enabled.NewButton="false"/>
<s:Button id="b2" label="New Button"
includeIn="NewButton"/>
</s:HGroup>
<s:Button label="Change to NewButton state"
click="currentState='NewButton';"/>
<s:Button label="Change to default view state"
click="currentState='default';"/>
<s:TextArea id="MyEnterTA"/>
<s:TextArea id="MyExitTA"/>
</s:VGroup>
</s:Application>

 

用浏览器切换状态

Flex browser manager能够让用户通过浏览器的前进后退按钮来导航应用。因为这个browser manager能够对状态的切换进行跟踪。    

以前说过,每个状态是个新的界面,而不是一个新的页面。但是用浏览器也能实现不同状态之间的切换。如何做到呢?先看看背景知识。

BrowserManager:一个 Singleton 管理器,用于充当浏览器和应用程序之间的代理。使用它可以访问浏览器地址栏中的 URL,这与访问 JavaScript 中的 document.location 属性类似。它有一个getInstance() 方法,返回的是一个IBrowserManager类的实例。
IBrowserManager:由 BrowserManager 的共享实例实现的接口。init()方法:初始化 BrowserManager。fragment属性:当前 URL 显示在浏览器地址栏中时,“#”之后的部分。
看个实例
<?xml version="1.0"?>
<!-- states\StatesBrowserManager.mxml -->
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/halo"
xmlns:s="library://ns.adobe.com/flex/spark"
creationComplete="initApp();">
<fx:Script>
<![CDATA[
import mx.managers.BrowserManager;
import mx.managers.IBrowserManager;
import mx.events.BrowserChangeEvent;
import mx.utils.URLUtil;
// The search string value.
[Bindable]
public var searchString:String;
// 一个 BrowserManager 类的实例.
private var browserManager:IBrowserManager;
//在应用创建完成时初始化 BrowserManager.
public function initApp():void {
browserManager = BrowserManager.getInstance();
browserManager.addEventListener(BrowserChangeEvent.BROWSER_URL_CHANGE, parseURL);
browserManager.init("", "Browser Manager for View States");
updateURL('default');
}
// 当用户按前进后退按钮时触发事件,事件处理器从URL里接到状态的值,从而。用他
//设定当前状态。 
private var stateFromURL:String;
private function parseURL(e:Event):void {
var o:Object = URLUtil.stringToObject(browserManager.fragment);
stateFromURL = o.state;
currentState=stateFromURL;
}
// 状态改变时改变地址。
private function updateURL(myCurrentState:String):void {
var s:String = "state=" + myCurrentState;
browserManager.setFragment(s);
}
// 当按下go按钮时执行该方法。
// 它会改变状态以及调用updateURL()方法来改变URL。
public function doSearch():void {
currentState = "results";
updateURL('results');
searchString = searchInput.text;
}
// 点击reset按钮时执行该方法,该方法是状态改到默认值,。并且改变URL
public function reset():void {
currentState = '';
searchInput.text = "";
searchString = "";
updateURL('default');
}
]]>
</fx:Script>
<s:states>
<!-- The state for displaying the search results -->
<s:State name="default"/>
<s:State name="results"/>
</s:states>
<!-- In the default state, just show a panel
with a search text input and button. -->
<s:Panel id="panel1"
title="Search" title.results="Results"
resizeEffect="Resize"
width="10%" height="10%"
width.results="100%" height.results="100%">
<s:layout>
<s:VerticalLayout/>
</s:layout>
<s:SkinnableContainer id="searchFields" defaultButton="{b}">
<s:layout>
<s:HorizontalLayout/>
</s:layout>
<s:TextInput id="searchInput"/>
<s:Button id="b"
label="Go"
click="doSearch();"/>
<s:Button includeIn="results"
label="Reset"
click="reset();"/>
</s:SkinnableContainer>
<s:SimpleText includeIn="results"
text="Search results for {searchString}"/>
</s:Panel>
</s:Application>
有点长哦!
在这个实例中,当用户改变状态时,updateURL()就会将相应的地址写到浏览器的地址栏,当按浏览器的前进或者后退按钮时,parseURL()方法会从URL中获得当前状态值,并且改变状态。

 

 

分享到:
评论

相关推荐

    了解 flex State对象

    Flex State对象是Adobe Flex框架中的一个关键特性,它允许开发者管理应用程序的不同视图或界面状态。在Flex程序中,状态设计是一种强大的工具,用于根据用户的交互和应用需求动态地改变UI布局和组件行为。通过使用...

    flex-最简单的state对象控制

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

    flex state跳转

    在Flex中,State机制是一种强大的设计模式,用于管理用户界面的不同视图和交互状态。本篇文章将深入探讨“flex state跳转”这一主题,以及如何在Flex项目中利用state来实现页面或组件的动态跳转。 一、什么是Flex ...

    FLEX4的皮肤skin

    总结来说,FLEX4的皮肤系统允许开发者通过SparkSkin类和相关的皮肤状态来实现高度定制的用户界面。通过理解SparkSkin的结构和工作原理,以及如何应用和创建自定义皮肤,开发者能够为Flex应用程序带来独特的视觉风格...

    android获取网络状态Flex开发

    本文将深入探讨如何在Android平台上使用Flex进行网络状态检测,包括2G、2.5G以及WiFi网络的监测。 ### 知识点一:Flex与Android的结合 Flex是Adobe公司推出的一种用于构建高性能且具有丰富交互性的Web应用程序的...

    Flex 模拟CheckBox多状态切换

    6. **测试与使用**:最后,将这个新组件添加到你的Flex应用程序中,通过改变其`state`属性或交互操作,观察多状态切换的效果。 通过以上步骤,我们就成功地在Flex中实现了模拟CheckBox的多状态切换功能。这个自定义...

    flex 4 生命周期

    在Flex 4中,Adobe引入了更高效的设计模式,如States和Effects,以更好地管理组件的状态变化。 首先,组件的创建过程始于`initialize`事件,这是组件实例化后首次允许开发者进行属性设置的时刻。接着,`...

    Flex4创建页面

    ### Flex4创建页面知识点详解 ...通过以上内容的详细介绍,我们可以清晰地理解如何在Flex4中创建页面(状态),并实现页面间的逻辑切换及数据绑定。这对于构建复杂且交互丰富的Flex应用来说是非常重要的。

    flex的state组件和trasition组件例子

    State组件是Flex中用于管理不同UI状态的机制,它允许开发者定义一个组件在不同场景下的多种外观和行为。例如,一个按钮在被点击时可能需要改变颜色或显示不同的图标,这些不同的表现形式就可以通过定义不同的State来...

    FLEX入门实例--------transition,state的综合运用

    在本实例中,我们将深入探讨Adobe Flex中的"transition"(过渡)和"state"(状态)的概念,这两个概念是创建动态且交互性丰富的用户界面的关键元素。Flex是一种用于构建富互联网应用程序(RIA)的开放源代码框架,它...

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

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

    Flex 简单的几个实例 

    4. 使用TransitionManager:Flex提供了一个名为`TransitionManager`的类,可以帮助我们方便地管理状态之间的过渡。我们可以在代码中创建一个过渡对象,设置其持续时间、缓动效果等参数,然后将其应用于需要转换的...

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

    ### Flex4之控制状态转换及产生动画特效详解 #### 一、引言 Flex4作为Adobe公司的开源框架,因其强大的跨平台能力与丰富的组件库,被广泛应用于开发复杂的富互联网应用(RIA)。本文将详细介绍如何利用Flex4实现登录...

    Flex4 Spark皮肤

    在这段代码中,首先定义了按钮的四种状态(`up`、`over`、`down` 和 `disabled`),然后通过`[HostComponent("spark.components.Button")]`元数据指定该皮肤适用于 `Button` 组件。接下来,定义了按钮的主要视觉元素...

    Flex4的皮肤文档及demo

    在Flex4中,皮肤定制是UI设计的重要组成部分,它允许开发者根据需求自定义组件的外观和交互效果。本主题主要围绕`SparkSkin`类和`Skin`类展开,这两类在Flex4的皮肤定制中扮演着核心角色。 **SparkSkin介绍** `...

    Flex4 Login DEMO project

    7. **状态管理**:Flex 4中的State机制允许根据不同的应用状态改变界面布局。在登录DEMO中,可能有登录前后的不同状态,比如错误提示状态或成功登录后的主界面状态。 8. **样式表(CSS)**:Flex 4支持使用CSS来...

    Flex与ActionScript3程序开发

    第7章 特效effect和状态state 第8章 Flex与Flash无缝衔接 第9章 综合演练:实现仿Office 2007风格的界面 第3篇 组件高效技法篇 第10章 PopUpManager与ToolTipManager 第11章 Form组件与基本表单元素 第12章 ...

    FLex 物品分类游戏

    5. **状态管理**:游戏可能有多个阶段或状态,Flex的State机制可以方便地切换UI布局和行为,适应不同游戏阶段的需求。 6. **XML数据存储**:游戏物品信息可能以XML格式存储,利用Flex的XML类进行读取和解析,便于...

    flex4实战 代码

    10. **State管理**: 通过状态管理,可以轻松地改变应用程序的不同视图,适应不同场景的需求。 11. **移动开发**: Flex4支持创建跨平台的移动应用,通过Adobe AIR运行时可以在iOS和Android等平台上运行。 通过...

Global site tag (gtag.js) - Google Analytics