Flex学习总结

Flex SDK Flex框架类库、Flex编译环境、调式器、MXML、ActionScript编程语言以及其它工具组成,Flash Builder是其开发环境,

 

Flash Player的工作模型

由两大部分组成:ActionScrip虚拟机 图形渲染引擎GR

 

 

Flex实战

认识Flex

javaScript和ActionScript都是基于ECMAScript标准的实现。

BlazeDS简介:

LiveCycle是面向大型企业的,还有一个类似的产品:BlazeDS,作为中间层的服务器组件,它的功能是:使用HTTP和AMF3的实时数据推送。是免费的,

BlazeDS是java社区采用Flex的主要原因,它允许java开发人员通过把BlazeDS作为连接Flex对象和java对象的桥梁。

Flex的工作原理

Flex的核心是免费的sdk,sdk提供了构建Flex应用程序的框架,

Flex语言,创建Flex应用程序要使用Flash Builder;

Flex由两种编程语言组成:

基于XML的MXML标签语言

ActionScript脚本语言

MXML负责应用程序核心内容的主要布局,ActionScript用于以脚本形成编写驱动应用程序需要的所有逻辑。

开发生命周期

典型Flex应用程序SDLC:

使用Flash Builder或SDK,在本地开发环境中编写MXML和ActionScript代码

测试使用Flash Builder,sdk编译代码,输出.swf

通过浏览器启动此文件,此时需要调用Flash Player插件,开始执行应用程序。

Flex应用程序要与服务器层交互以获得数据

准备发布应用程序,将.swf及相关文件发布到web服务器上,用户通过一个URL调用该应用程序。

 

事件驱动的环境

一切与事件有关,Flex是一个事件驱动的开发框架。

事件驱动的应用程序包含的这两种机制分别是:

事件触发器:导致事件发生。

事件处理程序:负责响应事件的处理程序。其实就是逻辑代码。

Flex的局限

 

 

 

  1. 从零开始

建立编译环境

  1. 下载Flex SDK,
  2. 检查是否安装了FlashPlayer,如安装了,删除它,因SDK中用;
  3. 安装SDK中的FlashPlayer,
  4. Flash Player 10 ActiveX.exe 这是针对IE调试播放器
  5. Flash Player 10 Plugin.exe 这是针对其他浏览器的调试播放器
  6. 在bin文件夹添加到path环境变量中,c:flexin

建立编辑环境

Eclipse下载一个插件:

获得Flash Builder

它有两个分发方式,一种独立版,另一种是插件版

探索Flash Builder

5个类别

Package包,表示当前所在的目录

Class类,表示这个api参考页面描述的特定对象

Inheritance继承,当前对象继承了哪些父对象

Implements实现,接口,对象会实现接口所要求的属性和函数方法,

Subclasses子类,当前对象的子对象,

 

Properties属性,可以检索和设置的值

Methods方法,支持函数

Event事件,对象会对此有所反应的操作,当某种操作发生时会触发特定指令的执行

Style样式,类似于html中使用的css样式

effects效果,与事件一起使用,以便指定播放效果。

 

MXML与ActionScript速写

Flex基于MXML和ActionScript;

MXML的结构:MXML是一种基于标签的编码系统,它派生自XML,MXML遵循XML所有规则和约定:

  1. XML文件以及MXML文件,要求必须有xml声明 用以定义版本和字符编码

    <?xml version="1.0" encoding="utf-8"?>

  2. XML文件必须有一个顶层的根元素及尾元素
  3. MXML语言区分大小写
  4. 每一个标签必须都有一个开始标签和结束标签,
  5. 标签间的嵌套关系必须正确。
  6. 特性的值必须加引号
  7. 每个空的字符都算数

MXML与ActionScript的关系

使用ActionScript添加功能、做出判断,提供交互性及构建业务逻辑。

事件由ActionScript处理

Flex应用程序是由事件驱动的,程序中发生的一切都是由事件引起的结果。

 

 

 

 

 

 

 

 

 

 

BlazeDS

BlazeDS 为使用Flex 或者AIR 的客户端程序提供了高度可扩展的远程访问和消息服务。
blazeds :是一门技术,是一门面向AS的前后台通讯框架
在服务器端:提供3种服务,远程调用(remoting-config.xml中配置),访问代理(proxy-config.xml中配置)、消息服务(messasing-config.xml中配置)同时允许你添加一些自定义的服务(在service-config.xml中配置)
在客户端blazeds 提供了RemoteObject、HttpService、WebService、Product、Comsumer等组件来提供访问服务器端数据的能力,其中RemoteObject、Product、Comsumer是amf协议来交换数据的,而HttpService、WebService是用比较通用的访问协议可以用来访问非blazeds服务器。
关联客户端和服务器端:destination、channel、endpoint。首先在服务器端定义需要的destination,根据destination所属的service类别不同,应该在destination定义在不同的配置文件里(remoting-config.xml、messaging-config.xml、proxy-config.xml中),同时为destination指定channel(如果不指定,会用默认的channel)、
以上所有这些组件都包括在flex SDK和rpc.swc组件库中
在客户端的代码你只要为你的组件(如remotingObject)指定destination和取得数据后的回调函数就可以了,剩下的就是编译器的事情了。Flex为你隐藏了channel的调用,所以需要写的代码很少。

BlazeDS通过使用RemoteObject控件可以轻松实现,而不需要配置他们像SOAP-compliant网络服务。
BlazeDS可以访问各种不同的数据持久化方案,比如数据库、JMS等其他持久化机制。The message-based framework(基于消息的框架)
BlazeDS在客户端和服务器端来回的传送数据,他是一个基于消息的框架,主要运用了两种交换模式,第一种,请求/响应模式,客户端发送请求给服务端,服务端处理好之后返回一个包含结果的响应,RPC服务就是使用的这种模式;第二种,发布/订阅模式,服务端将数据发布给订阅了该消息的客户端列表,消息服务就是使用这种模式来发布数据给各客户端的,同时,消息服务也使用请求/响应模式来解决一些发布消息、数据交换等问题。

 

Flex与服务器端通信第三种方式,remote object,远程对象

Adobe:LCDS(LiveCycle Data Service),BlazeDS

 

 

 

 

三、使用ActionScript

注释:行注释// one comment; 多行注释 /* */

变量

声明某种类型的变量后,赋值必须是这种类型的变量,如不是这行代码就是无效的。

var myVar:Number;

myVar = "test";

Flex检查类型匹配的方法有两种,即静态类型检查和动态类型检查

静态类型检查在编译时执行,由编译器负责维护类型规则。

动态类型检查,Flash Player负责在应用程序执行期间决定变量类型。

默认情况下,编译应用程序时使用的静态类型检查。

顶级类

在Flex4中所有基本数据类型都被转换成类,并放到顶层包中。在顶层包中包含的一些类:array,Boolean,Class,Date,int,Number,Object,String,Uint,Vector,XML,XMLList;

顶层类是不需要导入包的。

var myString:String = "hello";

var myXML:XML=<root><node></node><root>;

var myObj:Object={x:1,y:2,z:3};

特殊的数据类型

*

 

void

 

undefined

与void同时使用,void的值是undefined

null

 

NaN

非数字,由number数据类型使用,

ActionScript变量区分大小写,

 

循环

  1. for(初使值;条件;递增)

for(var x:int = 1 ; x <= 10;i++)

trace()是把结果输出到日志文件中,

  1. for(属性名 in 数组/对象);

var myArray:Array = {"a","b","c"};

for(var myStr:String in myArray)

{ trace(myStr); }

结果:0,1,2

这种循环是按照属性名迭代,数组的属性名是数组的索引,取值时需要通过下列形式取值。

trace(myArray(myStr))

 

  1. for each(项in数组/对象)

for each … in 循环用于迭代数组和对象,但测试的不是属性名,需是属性值。

for each(var i:string in myObject){

    trace(i); 打印出来是值,不是键

}

  1. while

whiel(x < 5){

    trace(x);

}

  1. do while
  2. if…else

if()

{..}

else if()

else

{}

  1. switch

    switch(){

    case 'happy';

    case 'sad'

    default:

    }

  2. 数组

ActionScript支持3种主要数组:

索引数组 以数值作为每个值的键。

var hArray:Array= new Array();

push() 把项添加到数组末

hArray.push("John Doe");

unshift() 把项添加到开头

hArray.unshift("Mike");

pop() 删除数组末尾的项

hArray.pop();

shift()删除数组开头的项

hArray.shift()

splice()从某个位置删除项,然后根据需要插入新项

第一个参数:指定从数组中的哪个索引位置开始操作,

第二个参数:指定想要删除的数量,

第三个参数:从第一个参数指定的索引开始插入新的项。

hArray.splice(1,0,"hello");

hArray.splice(1,1);

hArray.splice(3,2,"Ryan","matt","Jeff");

数组的初始化:

var Arrayhouse:Array = new ["a","b","c"];

 

关联数组 以任何形式的键与值建立关联。

它与索引数据的区别在于,与值对应的键面不是索引,关联数组中的项是以无序方式保存的,

var carM:Array = new Array();

carM["ax"] = "s";

carM["ab"]="c";

在检索时,通过键就可以访问。

trace(carM["ax"]);

关联数组支持使用点表示

carM.ax;

 

多维数组 数组的数组。

 

ActionScript特色语法

花括号

逻辑操作符和快捷方式

++;--;

基本比较符

==;!=;<;<=;!求反

数学操作符:

*,/,%,+,-

函数、类、包

创建函数

public function checkout(input:String):void{}

CDATA在这里是告诉Flex编译器方括号中的内容原样不动,不作为XML处理;

将ActionScript代码保存在单独的文件中

文件名保存为myFunction.as;;

<fx:Script source="myFunction.as" />

<fx:Script>

<![CDATA[

import mx.controls.Alert;

]]>

</fx: script>

注意:必须在使用函数的文件中导入包;

简单的数据绑定

ActionScript支持一种功能,能够让一个项目监听另一个项目的值,这个功能就是绑定。

不使用绑定:

<s:Button label="Copy:" click="myinput2.text = myinput1.text"/>

添加绑定:

<s:TextInput id="myinput2" text = "{myinput1.text}" />

还可以使用双向绑定,

<s:TextInput id="myinput1" text = "{myinput2.text}" />

<s:TextInput id="myinput2" text = "{myinput1.text}" />

在花括号内可以放置任意表达式;

绑定标签

使用<fx:Binding>标签在外部连接组件,

<fx:Binding source="myinput1.text" destination="myinput2.text" twoWay="true" />

<s:TextInput id="myinput1"/>

<s:TextInput id="myinput2"/>

使用ActionScript变量可被绑定

要为ActionScript变量添加绑定,需要使用元关键字[Bindable],在mxml中的元关键字用于描述变量,组件,类的额外属性,

四、布局和容器

1.Spark与Halo/mx

Spark容器允许改变布局算法,需Halo组件则内置布局算法。

布局通过布局管理器处理,通过3个阶段确定每个视觉组件的位置和大小:

  1. 提交过程,查看所有组件的属性设置,将执行每个组件的commitProperties()方法,
  2. 测量过程,计算所有组件的默认大小。首先查看最深层的组件,然后由内而外查看其他组件。布局管理器运行每个对象的measureSizes()方法来确定默认/指定的大小。
  3. 布局过程,这个过程是从最外层开始,逐步深入到嵌套层次最深的组件。这个过程调用每个组件的updateDisplayList()方法,使组件刷新显示的内容。

每个Spark窗口都支持将其布局改为下面任意一种布局:

BasicLayout绝对布局,使用x,y坐标

HorizontalLayout

VerticalLayout

TileLayout网格形式显示组件,创建尽可能多的行和列

 

xmlns:fx和xmlns:s 为Spark组件添加前缀

xmlns:mx 为Halo/MX组件添加前缀

 

2.绝对布局(BasicLayout)

Application窗口默认使用的绝对布局;

3.基于约束的布局

它是相对于容器的4个边或容器中心点定位组件。

这个容器的优点是在调整窗口大小的时,仍然可以保持组件与容器的相对位置关系不变。

基本约束,组件离窗口的右下角的距离,

组件的top,bottom,left,right属性用于控制与相关边的距离

horizontalCenter,verticalCenter属性控制在相应方向与中心的距离,

baseline属性用于设置组件的上边与其父容器的距离。

增强的约束,这个允许开发人员在水平和垂直方向上任意创建隐藏的辅助线,然后对照辅助线定位组件。这些辅助线中约束行和约束列。

约束线有3种方法放到容器中:

固定约束 位置由绝对数字来指定

相对约束 位置由相对容器大小的百分比来确定

内容大小约束 相对于内容而言是确定的。

1.两列固定分割 通过<mx:ConstraintColumn>标签可以在容器中创建两个列

<mx:Canvas width="100%" height="100%" borderColor="0x996969">

        <mx:constraintColumns>

            <s:ConstraintColumn id="col1" width="200"/>

            <s:ConstraintColumn id="col2" width="50"/>

        </mx:constraintColumns>

        <s:Button left="col1:50" label="button 1"/>

        <s:Button left="col2:0" label="button 2"/>

    </mx:Canvas>

2.带左右约束的两列固定分割

<s:Button left="col1:50" label="button 1" right="col1:0"/>

<s:Button left="col2:0" label="button 2" right="col2:0"/>

3.带上下约束的两行固定分割

4.有偏移的两行加两列分割

5.基于内容大小的约束

它是在不指定约束的heigth和width属性的值时自动启用的。

4.自动布局

1.使用布局类

对Spark容器可以使用4种布局类,用于绝对布局(BasicLayout类),

HorizontalLayout,VerticalLayout,TileLayout,则提供了自动布局选项。

<s:layout>

    <s:TileLayout columnWidth="200" orientation="columns" requestedColumnCount="2"/>

</s:layout>

    <s:Button label="button 1" />

    <s:Button label="button 2" />

    <s:Button label="button 2" />

2.需要空间

<mx:Spacer/> 相当于<td width="50"></td>

<s:Button label="button 1" /> <s:Spacer width="50%" />

    <s:Button label="button 2" />

5.可变大小和固定大小

就是使用数值或是百分比来进行控制。

6.容器

容器是组件的集合,用于为应用程序提供一种视觉结构。

Flex新添加的一些Spark容器:

Application 一个应用程序只能有一个Application容器,是程序的根窗口。

Group用于分组项目的一个基本容器,默认用BasicLayout绝对布局。它的子容器是

Hgroup,Vgroup

SkinnableContainer 类似于Group,但支持换肤功能。

Panel基于SkinnableContainer,添加一个标题栏和一个框架

DataGroup用于分组数据,

SkinnableDataContainer类似于DataGroup,可换肤。

Application容器

这是Flex应用程序的主程序,属性:preloader,这是启动Flex应用程序时看到的进度条。

xmlns:local="*"

 

Canvas容器

基于Group的容器和SkinnableContainer

<s:Group>

<s:Hgroup/>

<s:Vgroup/>

 

创建皮肤文件,有两条基本规则:

1.必须支持组件可能具有的所有状态。

2.必须在名为contentGroup的皮肤内定义一个额外的容器。

创建皮肤类:CoolSkin.mxml;

<s:SparkSkin xmlns:fx……..>

</s:SparkSkin>

引用:

<s:SkinnableContainer skinClass="CoolSkin">

        <s:layout>

            <s:HorizontalLayout/>

        </s:layout>

        <s:Button label="button 1"/>

        <s:Button label="button 2" />

    </s:SkinnableContainer>

Panel容器

默认使用BasicLayout类,

<s:Panel title="MY Title">

        <s:HGroup top="5" bottom="5" left="5" right="20">

            <s:Button label="button1" />

            <s:Button label="button2" />

        </s:HGroup>

    </s:Panel>

 

ApplicationControlBar容器

在应用程序中创建了一个与多数桌面应用程序的File菜单以进行编辑,设置等类似的区域,

    <mx:ApplicationControlBar width="100%" >

        <s:Button label="Back" />

        <s:Button label="Forward" />

        <s:TextInput width="60" />

        <s:Button label="Search" />

    </mx:ApplicationControlBar>

 

DataGroup和SkinnableDataContainer

 

dataGroup或SkinnableDataContainer可以使用下面这两个项渲染器,

spark.skins.default.DefaultItemRenderer将数据显示为简单文本

spark.skins.default.DefaultComplexItemRenderer将数据显示为Group容器内的组件。

 

 

 

DividedBox、HDividedBox、VDividedBox容器

 

 

From容器

 

 

 

Grid容器

 

 

 

五、显示表单与捕获用户输入

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

六、验证用户输入

原文地址:https://www.cnblogs.com/liyanwei2013/p/3371166.html