行为和特效
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>