`
Zsb007
  • 浏览: 59349 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

了解 flex State对象

阅读更多
在Flex 程序中,引入了状态设计的概念。在一个程序中,按照功能的需求,将界面切分成相对独立的部分。运行过程中,随着用户交互,界面在各个部分之间切换。比如在购物车程序中,登录界面、选购商品界面、购物车界面、付款界面,这些部分代表着不同的功能,显示当前程序的运行状态,每个界面便是一个状态(Status)。

在一个复杂的程序中,将程序按照功能进行结构划分是非常重要的,这样,问题会变得明了,这也是使用状态设计的原因。

其实,我们和状态打过很多交道,只不过没有把它理论化。比如,鼠标的点击动作,也是由几个状态组成的:鼠标移上、鼠标按下、鼠标松开、鼠标移开。用这种视角来分析问题,条理就很清楚,不容易陷入令人烦恼的逻辑纠纷中。

当状态发生改变时,我们可以为两个状态的切换添加形变动画。形变动画由若干个动画效果组成,可以理解为:状态的切换也是行为的一种,因此,形变动画的创建和使用与行为一样,非常简单。

在Flex中,状态的创建也是很简单的。我们不需要花费时间在界面的设计上,也不用去关心状态的运作方式,这些都由Flex来完成。

所有的组件都实现了状态机制,一般情况下,容器类组件或有容器特色的组件和状态机制是最佳组合,这样状态机制就可以控制程序的一个功能块。

请看实例demo.mxml的源程序:
<?xml version="1.0" ?>
<!-- Simple example to demonstrate the States class. -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
        <![CDATA[
            import mx.controls.Alert;
            import mx.events.CloseEvent;
           
            private function clickHandler(event:Event):void {
                Alert.show("Do you want to save your changes?", "Save Changes", 3, this, alertClickHandler);
            }
       
            // Event handler function for displaying the selected Alert button.
            private function alertClickHandler(event:CloseEvent):void {
                 if (event.detail==Alert.YES)
                 {
                    //status.text="You answered Yes";
                    lable1.text = "Please Login!";
                    currentState='';
                 }
                 else
                 {
                     currentState='Register';
                    //status.text="You answered No";
                 }
            }
        ]]>
</mx:Script>          
    <!-- Define one view state, in addition to the base state.-->
    <mx:states>
        <mx:State name="Register">
            <mx:AddChild relativeTo="{loginForm}" position="lastChild">
                <mx:target>
                    <mx:FormItem id="confirm" label="Confirm:">
                        <mx:TextInput/>
                    </mx:FormItem>                   
                 </mx:target>
            </mx:AddChild>
            <mx:AddChild relativeTo="{loginForm}" position="lashChild">
                 <mx:target>
                    <mx:FormItem id="email" label="Email:">
                        <mx:TextInput id="emailId"/>
                    </mx:FormItem>
                </mx:target>
            </mx:AddChild>
            <mx:SetProperty target="{loginPanel}" name="title" value="Register"/>
            <mx:SetProperty target="{loginButton}" name="label" value="Register"/>           
            <mx:SetEventHandler target="{loginButton}" name="click" handlerFunction="clickHandler" />
           
            <mx:SetStyle target="{loginButton}"
                name="color" value="blue"/>
            <mx:RemoveChild target="{registerLink}"/>
           
            <mx:AddChild relativeTo="{spacer1}" position="before">
                <mx:target>
                    <mx:LinkButton id="loginLink" label="Return to Login" click="currentState=''"/>
                </mx:target>
            </mx:AddChild>
        </mx:State>
    </mx:states>

    <!-- Define a Panel container that defines the login form.-->
    <mx:Panel title="Login" id="loginPanel"
        horizontalScrollPolicy="off" verticalScrollPolicy="off"
        paddingTop="10" paddingLeft="10" paddingRight="10" paddingBottom="10">

        <mx:Text width="100%" color="blue" id="lable1"
            text="Click the 'Need to Register?' link to change state. Click the 'Return to Login' link to return to the base state."/>

        <mx:Form id="loginForm" >
            <mx:FormItem label="Username:">
                <mx:TextInput/>
            </mx:FormItem>
            <mx:FormItem label="Password:">
                <mx:TextInput/>
            </mx:FormItem>
        </mx:Form>
       
        <mx:ControlBar>
            <mx:LinkButton id="registerLink"  label="Need to Register?"
                click="currentState='Register'"/>
            <mx:Spacer width="100%" id="spacer1"/>
            <mx:Button label="Login" id="loginButton"/>
        </mx:ControlBar>
       
    </mx:Panel>
</mx:Application>

这里在mx:states标签中添加了一对mx:State标签,用来定义一个状态,并命名为“detail”。在State对象可以使用如下方法:

l  SetEventHandler:设置对象某一事件的监听方法

l  SetProperty:设置对象的属性

l  SetStyle:设置对象的样式

l  AddChild:向对象添加一个子级元素

l  RemoveChild:删除一个子级元素

l  Transition:设置状态的过渡动画效果

当程序或组件切换到目标状态时,里面添加的方法就会被自动调用。

在上面的实例中,使用了AddChild和RemoveChild方法。其中AddChild的relativeTo属性表示目标容器,position表示新对象在容器中的位置,可选的值有before、after、firstChild和lastChild。

<mx:AddChild relativeTo="{contentPanel}" position="lastChild" creationPolicy="all">

      ……

</mx:AddChild>

position 默认是lastChild,表示在所有子级元素的最后;firstChild表示添加在目标的所有子级元素最前面;before和after分别表示添加到对象的所在容器中,处于对象位置的前面和后面。在添加对象时,creationPolicy可以控制对象对子级元素的显示操作,可选的值有:all, auto,none和queued。all表示总是创建对象;auto表示只有需要对象时才创建;queued表示将对象放在等待创建的队列中,对象完成初始化再开始创建子级元素;none则表示不创建对象,直到调用了createComponentsFromDescriptors函数时才创建它。默认为auto,有时为了强迫对象总是显示出来,可以设为all。如果没有特殊的需求,设为all就可以了。

RemoveChild使用起来比较简单,只要指定目标即可:

<mx:RemoveChild target="{img}"></mx:RemoveChild>

这条语句表示删除img对象。

在使用State对象时,currentState属性代表了当前对象的状态,利用它我们可以很方便地操作状态的切换。在函数changeState中,就是利用currentState来改变状态的:

//判断当前状态,状态默认为空值

if(currentState == "detail"){

    currentState = "";          //切换到默认状态        

    btn.label = "了解详情";      //修改按钮的文字

}else{

    currentState = "detail";    //切换到detail状态     

    btn.label = "返回简介";

}

在从默认状态切换到“detail”状态时,<mx:State name = "detail">…< mx:State>标签内的代码开始执行。如果再次返回默认状态,所有的物件仍会恢复原貌。也就是说,“detail”状态下通过 AddChild、RemoveChild等进行的修改不会影响默认状态,被删除的物件仍然还在。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/YooLive/archive/2008/05/08/2417661.aspx
分享到:
评论

相关推荐

    Flex语言开发介绍及实例

    总的来说,学习Flex开发,你需要了解ActionScript的基本语法,掌握MXML的布局和组件声明,熟悉Flex SDK和相关开发工具的使用,以及如何通过REST接口与其他Web服务进行数据交互。通过实例学习,可以更好地理解和应用...

    flex+php.rar_Flex+PHP_PHP Flex_felx p_flex_flex php

    Flex和PHP的集成是开发富互联网...通过深入研究这个压缩包提供的源码,开发者可以了解到如何在实际项目中结合使用Flex和PHP,实现前后端的无缝交互。这种结合对于需要高度交互性和实时性的Web应用来说是非常有价值的。

    我的flex资料1

    6. **Flex应用结构**:了解Flex应用的基本结构,包括Application、Module、State等,有助于组织和管理大型项目。 7. **Adobe AIR**:如果你打算开发桌面应用,需要了解Adobe AIR,它是将Flex应用部署到桌面环境的...

    flex+java增删改查(spring+jpa)简单例子

    标题 "flex+java增删改查(spring+jpa)简单...通过阅读提供的博客链接(如果有效),可以更深入地了解每个组件的配置和交互。同时,分析和运行“firstFlex”这个压缩包内的代码,可以帮助读者亲自动手实践这些概念。

    flex4实战 代码

    1. **ActionScript 3.0**: Flex4的主要编程语言,它是一个面向对象的语言,基于ECMAScript 3,并进行了很多增强,如类型系统、错误处理和性能优化。 2. **MXML**: MXML是一种声明式语言,用于创建用户界面,类似于...

    flex做的留言版,flex爱好者走向成功的第一步啊

    7. RESTful API设计:理解REST(Representational State Transfer)架构风格,学会如何设计和实现简单的RESTful服务,以供Flex客户端调用。 8. Maven或Gradle:这些是常见的Java构建工具,可以自动化构建、测试和...

    Flex HTTPService如何给后台传递参数 .doc

    这种方法更适合XML格式的数据交换,并且可以配合`mx:State`进行状态管理。以下是一个简单的示例: ```xml &lt;user&gt;{httpEncoding("用户名']} &lt;psw&gt;{httpEncoding("密码']} ``` 在这个例子中,`&lt;mx:request&gt;`...

    FLEX MATE框架源代码

    同时,通过对源代码的学习,还可以深入了解Flex中的事件处理机制和XML配置文件的应用,这对于进一步提升Flex开发技能大有裨益。 总之,FLEX MATE框架源代码的学习是一个宝贵的机会,能够让我们更好地理解面向对象...

    flex arcgis 应用

    在开发基于ArcGIS Server的Adobe Flex应用程序时,首先需要了解ArcGIS Server的基础。ArcGIS Server是Esri公司的产品,它允许开发者创建和部署地理信息系统(GIS)服务,这些服务可以被各种客户端应用所使用。ArcGIS...

    幻想-Flex3基礎視頻教程第二部_教程源碼(a)

    ActionScript3.0是Flex的主要编程语言,它是基于ECMAScript的一个面向对象的脚本语言,具有更强大的性能和更丰富的类库。 在【幻想-Flex3基礎視頻教程第二部_示例代碼(a)】中,我们可能会学习到以下知识点: 1. **...

    Flex从入门到实践——源代码(10章)

    2. **Flex SDK和Flex Builder**:了解如何设置开发环境,包括安装Flex SDK和使用Flex Builder(现为IntelliJ IDEA或Adobe Flash Builder)。源代码可能包含项目配置和编译设置的示例。 3. **组件库**:Flex提供了...

    Flex 3企业级 Web应用系统设计与实现

    MXML是一种声明式语言,用于定义UI组件和布局,而ActionScript 3.0则作为面向对象的编程语言,处理逻辑和数据操作。 2. Flex SDK与Flex Builder:Flex SDK是免费的开发工具集,包含编译器和库,而Flex Builder是基于...

    flex页面跳转及数据绑定

    在Flex开发中,页面跳转和数据绑定是两个核心概念,它们对于构建动态且交互性强的应用至关重要。让我们分别深入探讨这两个主题。 ...了解和掌握这些技术,对于成为一名专业的Flex开发者至关重要。

    Flashcs3.Flex与asp.php通信总结包含数据库

    首先,让我们了解一下Flash CS3和Flex。Flash CS3是一款用于创建动画、互动内容的图形界面工具,而Flex是一个基于ActionScript 3.0的开源框架,主要用于构建RIA。它们都支持XMLSocket、HTTPService、Remoting等通信...

    ArcGIS RIA开发实践【背景篇】【Flex篇】

    通过以上内容的详细介绍,我们不仅了解了RIA的基本概念及其优势,还深入探讨了当前主流的RIA技术以及ArcGIS Server REST接口的相关知识。同时,也对ArcGIS Flex API有了初步的认识,包括其基本概念、地图功能组件及...

    flex_video_帮助2

    ### Flex VideoDisplay 组件详解 ...通过以上内容的介绍,我们了解到了`VideoDisplay`组件的强大功能及其丰富的配置选项。这些配置选项使得开发者可以根据具体需求灵活地定制视频播放器的外观与行为。

    前线塔防2 源文件

    首先,我们来了解一下“塔防”(Tower Defense)游戏的基本概念。塔防游戏是一种策略类游戏,玩家需要在指定路径上建造防御设施,阻止敌人抵达终点。这类游戏通常包含多种类型的防御塔,每种塔有不同的攻击方式和...

    Flutter基础学习之自定义组件

    1. **创建StatefulWidget**:当你需要在组件中管理状态时,你需要创建一个`StatefulWidget`类,并实现`createState`方法来返回一个`State`对象。`State`对象负责维护组件的状态,并在状态改变时更新视图。 2. **...

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

    `StyleSheet.create`用于创建可复用的样式对象,遵循CSS的驼峰命名规则。Flex布局是React-Native中用于构建灵活布局的主要工具,包括`flex`、`flexDirection`、`alignItems`和`justifyContent`等属性。 React-...

Global site tag (gtag.js) - Google Analytics