行为和特效
Flash是一个表现力非常强的平台,可以创造出一切想要的特效效果。在Flex所提供的类库中,就包含了一些行为和特效,可以实现表现力很强的动画效果。
使用行为、拖放行为特效、使用ViewState、过度特效、使用ToolTips
一、 使用行为
行为可以添加一些效果和动作,以相应用户和程序的操作。例如,使用行为,可以使一个窗体慢慢的淡入,直到完全可见。
1.1 行为简介
在Flex中,提供了一些有关行为的组件,可以通过使用MXML或者ActionScript定义这些行为。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<!-- 定义翻转效果 -->
<mx:Rotate id="myRT" duration="1000" />
<!-- 设置按钮的 mouseDownEffect 属性-->
<mx:Button id="myButton" label="单击这里"
mouseDownEffect="{myRT}" x="44" y="30" fontSize="14"/>
</mx:Application>
1.2 在ActionScript中使用行为
除了使用MXML代码创建行为外,还可以使用ActionScript代码。所有的行为类都放在mx.effects包中,所以在使用行为类之前需要引入此包。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
creationComplete="createEffect(event);">
<mx:Script>
<![CDATA[
// 导入效果类
import mx.effects.Resize;
// 创建一个 Resize 类
private var resizeLarge:Resize = new Resize();
private function createEffect(eventObj:Event):void
{
// 设置特效目标对象
resizeLarge.target = myTA;
}
private function startEffect():void
{
resizeLarge.end();
// 设置宽度和高度
resizeLarge.widthTo = 250;
resizeLarge.heightTo = 250;
// 设置频率
resizeLarge.duration = 550;
resizeLarge.play();
}
private function resetEffect():void
{
resizeLarge.end();
// 设置宽度和高度
resizeLarge.widthTo = 200;
resizeLarge.heightTo = 200;
// 设置频率
resizeLarge.duration = 550;
resizeLarge.play();
}
]]>
</mx:Script>
<mx:VBox x="40" y="28">
<mx:HBox>
<mx:Button label="开始" fontSize="14" click="startEffect()"/>
<mx:Button label="重置" fontSize="14" click="resetEffect()"/>
</mx:HBox>
<mx:TextArea id="myTA" height="200" width="200"
text="Hello World." fontSize="14" />
</mx:VBox>
</mx:Application>
二、 拖放行为特效
拖放操作可以把数据从一个地方拖到另外一个地方。在可视化的应用系统中,这样的操作是非常便捷的。
2.1 容器之间移动数据
几乎每个数据容器组件都有两个属性:dragEnabled和dropEnabled。dragEnabled属性表示允许从组件中拖出数据,而dropEnabled属性则表示允许向组件中放置数据。
默认情况下,当移动数据的时候,向目标对象中添加数据,同时在源对象中就会删除相应的数据。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
creationComplete="initApp()">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
private function initApp():void
{
// 设置数据源
srclist.dataProvider =
new ArrayCollection(['软件开发工程师', '网络维护工程师', '软件测试工程师']);
destlist.dataProvider = new ArrayCollection([]);
}
]]>
</mx:Script>
<mx:HBox>
<mx:List id="srclist" allowMultipleSelection="true"
dragEnabled="true" dragMoveEnabled="true"
width="150" height="200" fontSize="14"/>
<mx:List id="destlist" dropEnabled="true"
width="150" height="200" fontSize="14"/>
</mx:HBox>
</mx:Application>
2.2 容器之间复制数据
在默认情况下,设置dragEnabled和dropEnabled属性的值,可以移动数据。但是有些情况下,需要复制数据。在数据容器之间复制数据,需要设置dragDrop事件。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
creationComplete="initApp();">
<mx:Script>
<![CDATA[
import mx.events.DragEvent;
import mx.managers.DragManager;
import mx.core.DragSource;
import mx.collections.IList;
import mx.collections.ArrayCollection;
private function initApp():void
{
srcgrid.dataProvider = new ArrayCollection([
{Artist:'周杰伦', Album:'魔杰作', Price:41.68},
{Artist:'王力宏', Album:'摇滚怎么了', Price:39.09},
{Artist:'陶喆', Album:'太美丽', Price:36.59},
{Artist:'林俊杰', Album:'西界', Price:40.66}
]);
destgrid.dataProvider = new ArrayCollection([]);
}
private function dragDropHandler(event:DragEvent):void
{
if (event.dragSource.hasFormat("items"))
{
// 取消默认行为
event.preventDefault();
// 隐藏目标对象的指示器
event.currentTarget.hideDropFeedback(event);
// 获取拖放的目标对象
var dropTarget:DataGrid = DataGrid(event.currentTarget);
// 获取复制的数据集
var itemsArray:Array = event.dragSource.dataForFormat("items") as Array;
// 复制数据
var tempItem:Object = {
Artist1: itemsArray[0].Artist,
Album1: itemsArray[0].Album, Price1:
itemsArray[0].Price
};
// 获取拖放的目标对象的位置
var dropLoc:int = dropTarget.calculateDropIndex(event);
// 添加数据到目标对象的相应位置
IList(dropTarget.dataProvider).addItemAt(tempItem, dropLoc);
}
}
]]>
</mx:Script>
<mx:HBox>
<mx:VBox>
<mx:Label text="可选专辑" fontSize="14"/>
<mx:DataGrid id="srcgrid"
dragEnabled="true"
fontSize="12">
<mx:columns>
<mx:DataGridColumn dataField="Artist" headerText="歌手"/>
<mx:DataGridColumn dataField="Album" headerText="专辑"/>
<mx:DataGridColumn dataField="Price" headerText="价格"/>
</mx:columns>
</mx:DataGrid>
</mx:VBox>
<mx:VBox>
<mx:Label text="已经选购的专辑" fontSize="14"/>
<mx:DataGrid id="destgrid"
dropEnabled="true"
fontSize="12"
dragDrop="dragDropHandler(event);">
<mx:columns>
<mx:DataGridColumn dataField="Artist1" headerText="歌手"/>
<mx:DataGridColumn dataField="Album1" headerText="专辑"/>
<mx:DataGridColumn dataField="Price1" headerText="价格"/>
</mx:columns>
</mx:DataGrid>
</mx:VBox>
</mx:HBox>
</mx:Application>
2.3 手动添加拖放功能
数据控件中已经内置了拖放功能的支持,但是其他Flex组件却不受支持。想要非数据控件也支持拖放功能,必须通过相应的事件驱动来实现。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
import mx.core.DragSource;
import mx.managers.DragManager;
import mx.events.*;
import mx.containers.Canvas;
private function mouseMoveHandler(event:MouseEvent):void
{
// 获取拖放的源组件
var dragInitiator:Canvas = Canvas(event.currentTarget);
// 获取组件的颜色值
var dragColor:int = dragInitiator.getStyle('backgroundColor');
// 创建一个 DragSource 对象.
var ds:DragSource = new DragSource();
// 添加数据到对象中
ds.addData(dragColor, 'color');
// 调用 DragManager 类的 doDrag() 方法
DragManager.doDrag(dragInitiator, ds, event);
}
private function dragEnterHandler(event:DragEvent):void
{
// 判断源的数据格式
if (event.dragSource.hasFormat('color'))
{
// 获取目标对象
var dropTarget:Canvas = Canvas(event.currentTarget);
// 接受拖放
DragManager.acceptDragDrop(dropTarget);
}
}
private function dragDropHandler(event:DragEvent):void
{
var data:Object = event.dragSource.dataForFormat('color');
// 设置颜色.
myCanvas.setStyle("backgroundColor", data);
}
]]>
</mx:Script>
<!-- 可以拖放两种颜色的箱子. -->
<mx:VBox x="29" y="23">
<mx:HBox>
<mx:Canvas
width="30" height="30"
backgroundColor="red"
borderStyle="solid"
mouseMove="mouseMoveHandler(event);"/>
<mx:Canvas
width="30" height="30"
backgroundColor="green"
borderStyle="solid"
mouseMove="mouseMoveHandler(event);"/>
</mx:HBox>
<!-- 使用 dragEnter and dragDrop 事件允许拖放. -->
<mx:Canvas id="myCanvas"
width="100" height="100"
backgroundColor="#FFFFFF"
borderStyle="solid"
dragEnter="dragEnterHandler(event);"
dragDrop="dragDropHandler(event);"/>
<mx:Button id="b1"
label="清空"
click="myCanvas.setStyle('backgroundColor', '0xFFFFFF');"/>
</mx:VBox>
</mx:Application>
三、 使用View States
通过View States可以改变一个组件或是应用程序的外观,以相应用户的操作。例如,Adobe Reader阅读器中,当单击侧边栏相应按钮时,就会显示或隐藏书签和页面的导航栏。
3.1 使用View States改变局部视图
在Flex内置提供的View States组件中,可以向目标容器添加任意组件,还可以使用SetProperty设置其任意属性的值。通过这些特性,可以更新局部视图。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<!-- 定义 view states 组件的属性.-->
<mx:states>
<mx:State name="Register">
<!-- 在表单中添加一个 TextInput 控件. -->
<mx:AddChild relativeTo="{loginForm}"
position="lastChild">
<mx:FormItem id="confirm" label="再次确认密码:">
<mx:TextInput/>
</mx:FormItem>
</mx:AddChild>
<!-- 设置属性.-->
<mx:SetProperty target="{loginPanel}" name="title" value="注册"/>
<mx:SetProperty target="{loginButton}" name="label" value="注册"/>
<!-- 移除相应控件.-->
<mx:RemoveChild target="{registerLink}"/>
<!-- 添加相应控件-->
<mx:AddChild relativeTo="{spacer1}" position="before">
<mx:LinkButton label="返回登录"
click="currentState=''"/>
</mx:AddChild>
</mx:State>
</mx:states>
<mx:Panel id="loginPanel"
title="登录"
horizontalScrollPolicy="off"
verticalScrollPolicy="off">
<mx:Form id="loginForm">
<mx:FormItem label="用户名:">
<mx:TextInput/>
</mx:FormItem>
<mx:FormItem label="密码:">
<mx:TextInput/>
</mx:FormItem>
</mx:Form>
<mx:ControlBar>
<mx:LinkButton id="registerLink"
label="是否注册?"
click="currentState='Register'"/>
<mx:Spacer width="100%" id="spacer1"/>
<mx:Button label="登录" id="loginButton"/>
</mx:ControlBar>
</mx:Panel>
</mx:Application>
3.2 View States之间的继承关系
为了更好地应付复杂的代码,在View States组件中内置了继承的功能。所谓的继承,就是可以从其他的View States组件中继承相同的功能,而不需要再创建或设置一次。这样就大大增强了代码的重用性,使得开发更加快速,代码维护更加容易。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:states>
<mx:State name="NewButton">
<mx:AddChild relativeTo="{v1}">
<mx:Button id="b2" label="添加按钮 B2"/>
</mx:AddChild>
<mx:SetProperty target="{b1}"
name="enabled" value="false"/>
</mx:State>
<!-- 基于NewButton创建一个新的state -->
<mx:State name="NewButton2" basedOn="NewButton">
<mx:AddChild relativeTo="{v1}">
<mx:Button id="b3" label="添加按钮 B3"/>
</mx:AddChild>
</mx:State>
</mx:states>
<mx:VBox id="v1" x="36" y="29">
<mx:Button id="b1" label="Initial Button"/>
<mx:Button label="NewButton状态"
click="currentState = 'NewButton';"/>
<mx:Button label="NewButton2状态"
click="currentState = 'NewButton2';"/>
<mx:Button label="返回到原始状态"
click="currentState = '';"/>
</mx:VBox>
</mx:Application>
3.3 使用比较运算符
通过使用比较运算符,可以使得在同一个组件中,控制不同的视图。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:states>
<mx:State name="Register">
<mx:SetProperty
target="{loginPanel}"
name="title" value="注册"/>
<mx:SetProperty
target="{loginButton}"
name="label" value="注册"/>
</mx:State>
</mx:states>
<mx:Panel id="loginPanel" title="登录"
horizontalScrollPolicy="off" verticalScrollPolicy="off"
fontSize="12" x="65" y="30">
<mx:Form id="loginForm">
<mx:Button label="登录" id="loginButton"/>
</mx:Form>
<mx:ControlBar width="100%">
<mx:Button label="改变视图"
click="currentState =
currentState=='Register' ? '':'Register';"/>
</mx:ControlBar>
</mx:Panel>
</mx:Application>
四、 过渡特效Transitions
View States是用来改变一个组件或是应用程序的外观。Transitions则是定义了在视图之间切换的动作行为。可以通过使用effect类,来定义视图切换的动画效果。
4.1 使用Transitions
Transitions组件通过使用effect类,可以设置切换视图的不同动画特效。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
// 导入 Bounce 特效
import mx.effects.easing.Bounce;
]]>
</mx:Script>
<!-- 定义 transition 效果 -->
<mx:transitions>
<mx:Transition>
<mx:Parallel
targets="{[loginPanel, registerLink, loginButton, confirm]}">
<mx:Resize duration="500" easingFunction="Bounce.easeOut"/>
<mx:Sequence target="{confirm}">
<mx:Blur duration="200" blurYFrom="1.0" blurYTo="20.0"/>
<mx:Blur duration="200" blurYFrom="20.0" blurYTo="1"/>
</mx:Sequence>
</mx:Parallel>
</mx:Transition>
</mx:transitions>
<!-- 定义 states -->
<mx:states>
<mx:State name="Register">
<mx:AddChild relativeTo="{loginForm}"
position="lastChild">
<mx:FormItem id="confirm" label="确认密码:">
<mx:TextInput/>
</mx:FormItem>
</mx:AddChild>
<mx:SetProperty target="{loginPanel}"
name="title" value="注册"/>
<mx:SetProperty target="{loginButton}"
name="label" value="注册"/>
<mx:RemoveChild target="{registerLink}"/>
<mx:AddChild relativeTo="{spacer1}" position="before">
<mx:LinkButton label="返回登录界面"
click="currentState=''"/>
</mx:AddChild>
</mx:State>
</mx:states>
<!-- 设置视图 -->
<mx:Panel title="登录" id="loginPanel" fontSize="12"
horizontalScrollPolicy="off" verticalScrollPolicy="off">
<mx:Form id="loginForm">
<mx:FormItem label="用户名:">
<mx:TextInput/>
</mx:FormItem>
<mx:FormItem label="密码:">
<mx:TextInput/>
</mx:FormItem>
</mx:Form>
<mx:ControlBar>
<mx:LinkButton id="registerLink"
label="是否注册?"
click="currentState='Register'"/>
<mx:Spacer width="100%" id="spacer1"/>
<mx:Button label="登录" id="loginButton"/>
</mx:ControlBar>
</mx:Panel>
</mx:Application>
五、 使用ToolTips
ToolTips用来向用户提供一些相关的帮助信息,这有助于用户的操作。当用户把鼠标移动到可视化的控件中时,ToolTips就会引导用户进一步的操作程序。
5.1 使用ToolTips属性
在很多应用程序中,ToolTips都是一个标准性的功能。在Flex中也不例外,同样也提供了这样的属性。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:VBox toolTip="VBOX" fontSize="12">
<mx:Button id="b1" label="Button 1" toolTip="这是一个按钮控件"/>
<mx:Button id="b2" label="Button 2"/>
</mx:VBox>
</mx:Application>
5.2 设置ToolTips样式
如果默认的ToolTips样式不理想,可以通过Style组件,自己定义一个ToolTips样式。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Style>
ToolTip
{
fontFamily: "微软雅黑";
fontSize: 19;
fontStyle: "italic";
color: #FF0000;
backgroundColor: #5596EE;
}
</mx:Style>
<mx:Button id="b1" label="按钮"
toolTip="这是 toolTip 效果." fontSize="12"/>
</mx:Application>
5.3 使用ToolTips管理器
在Flex中提供了一个ToolTipManager类,是用来设置ToolTips相关特性的,如是否显示。ToolTipManager类位于mx.managers包中。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
// 导入 ToolTipManager 类
import mx.managers.ToolTipManager;
private function toggleToolTips():void
{
if (ToolTipManager.enabled)
{
// 设置提示框不可用
ToolTipManager.enabled = false;
}
else
{
// 设置提示框可用
ToolTipManager.enabled = true;
}
}
]]>
</mx:Script>
<mx:Button id="b1"
label="单击改变提示框状态."
width="150" fontSize="12"
click="toggleToolTips();"
toolTip="这是按钮提示框."
/>
</mx:Application>
5.4 创建一个自定义的ToolTips
在ToolTipManager类中,提供了两种方法来使用ToolTips。一个是createToolTip,用来创建ToolTips。另一个是destroyToolTip,用来销毁ToolTips。使用这两个方法,就可以在所有的组件中定义ToolTips。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
import mx.managers.ToolTipManager;
import mx.controls.ToolTip;
public var myTip:ToolTip;
// 鼠标经过事件
private function createBigTip():void
{
var s:String = "这些按钮可以保存、应用、取消执行的操作。"
// 创建ToolTip对象
myTip = ToolTipManager.createToolTip(s,10,10) as ToolTip;
// 设置ToolTip对象样式
myTip.setStyle("backgroundColor",0xFFCC00);
myTip.setStyle("fontSize",12);
// 设置ToolTip对象宽度和高度
myTip.width = 250;
myTip.height = 30;
}
// 鼠标移除事件
private function destroyBigTip():void
{
// 销毁ToolTip对象
ToolTipManager.destroyToolTip(myTip);
}
]]>
</mx:Script>
<mx:Style>
Panel
{
paddingLeft: 15;
paddingRight: 15;
paddingTop: 15;
paddingBottom: 15;
}
</mx:Style>
<mx:Panel title="ToolTips" fontSize="12" x="50" y="50"
rollOver="createBigTip()" rollOut="destroyBigTip()">
<mx:Button label="保存" toolTip="保存并退出"/>
<mx:Button label="应用" toolTip="接受改变并继续"/>
<mx:Button label="取消" toolTip="取消并退出"/>
</mx:Panel>
</mx:Application>