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

Flex 拖拽+XML 打造 布局变化过渡动画

    博客分类:
  • Flex
阅读更多

这篇文章是基于上篇文章

只是稍微复杂一点而已...

 

废话少说了,看代码:

package com.emavaj.myfriend.view{
	import flash.events.MouseEvent;
	
	import mx.controls.Alert;
	import mx.controls.Button;
	import mx.events.DragEvent;
	
	public class FriendIcom extends Button {
		/**添加监听.*/
		public function FriendIcom() {
			super();
			this.width = 100;
			this.height = 100;
			this.addEventListener(MouseEvent.MOUSE_DOWN,startDragHandler);
			this.addEventListener(MouseEvent.MOUSE_UP,endDragHandler);
		}
		/**启动拖拽.*/
		private function startDragHandler(event:MouseEvent):void {
			(event.target as Button).startDrag(); 	
		}
		/**停止拖拽.*/
		private function endDragHandler(event:MouseEvent):void {
			(event.target as Button).stopDrag();
		}
	}
}

 

这个就是视图上的元素类,它自动启用了拖拽

(至于这个拖拽的写法,我就不学网上那些Drag什么的Event了,因为我不需要响应那么多事件

所以用了简单的MouseDown&Up的方法)

 

PS:用MouseClick你永远做不了

 

下面是布局管理基类:

package com.emavaj.myfriend.layout{
	import flash.events.Event;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	
	import mx.collections.ArrayCollection;
	import mx.core.UIComponent;
	import mx.effects.Move;

	/**布局管理器*/
	public class LayoutManagerBase {
		/**当前的父容器.*/
		protected var father:UIComponent;
		/**数据来源.*/
		protected var xml:XML;
		/**存储*/
		protected var list:ArrayCollection = new ArrayCollection();
		
		/**构造函数*/
		public function LayoutManagerBase() {
		}
		
		/**创建元素.*/
		public function createElem(file:String, father:UIComponent):void {
			this.father = father;
			var request:URLLoader = new URLLoader();
			request.addEventListener(Event.COMPLETE,startCreate);
			request.load(new URLRequest(file));
		}
		
		/**开始创建.*/
		public function startCreate(event:Event):void {
		}
		
		/**重置数据.*/
		public function restart():void {
		}
		
		/**移动效果.*/
		protected function moveEffect(target:UIComponent,targetX:int,targetY:int):void {
			if (target.x != targetX || target.y != targetY) {
				var move:Move = new Move(target);
				move.xTo = targetX;
				move.yTo = targetY;
				move.play();
			}
		}
	}
}

 

这个类其实应该是个抽象类...可是...似乎...好像 AS3没有...

所以...子类只能用override了

下面是子类,也是真正的管理类:

package com.emavaj.myfriend.layout{
	
	import com.emavaj.myfriend.view.FriendIcom;
	
	import flash.events.Event;
	
	import mx.controls.Alert;
	
	/**图标管理器.*/
	public class IcomLayoutManager extends LayoutManagerBase{
		/**单例.*/
		private static var manager:IcomLayoutManager;
		/**另一种状态.*/
		private var otherXML:XML;
		/**状态标志.*/
		private var witchState:Boolean = true; 
		
		/**构造函数.*/
		public function IcomLayoutManager(){
			super();
			if (manager!=null) {
				throw Error("不能存在多个实例!");
			}
		}
		
		/**获取实例.*/
		public static function getInstance():IcomLayoutManager {
			if (manager==null) {
				manager = new IcomLayoutManager();
			}
			return manager;
		} 
		
		/**创建方法.*/
		override public function startCreate(event:Event):void {
			this.xml = new XML(event.target.data);
			var i:int = 0;
			for each (var elem:XML in xml.buttons.elements()) {
				var temp:FriendIcom = new FriendIcom();
				temp.x = elem.x;
				temp.y = elem.y;
				temp.id = "C" + i;
				temp.label = "BUTTON" + i;
				this.father.addChild(temp);
				this.list.addItem(temp);
				i++;
			}
		}
		
		/**重置数据.*/
		override public function restart():void {
			/**保存当前状态.*/
			this.otherXML = <layout><buttons/></layout>;
			var buttons:XMLList = otherXML.buttons;
			for (var i:int = 0; i < this.list.length; i++) {
				var temp:FriendIcom = this.list.getItemAt(i) as FriendIcom;
				buttons.appendChild(<button><x>{temp.x}</x><y>{temp.y}</y></button>);
			}
			//----测试-----Alert.show(this.otherXML);
			/**调整位置.*/
			this.moveTo(this.xml);
		}
		
		private function moveTo(data:XML):void {
			var i:int = 0;
			for each (var elem:XML in data.buttons.elements()) {
				var temp:FriendIcom = this.list.getItemAt(i) as FriendIcom;
				this.moveEffect(temp,elem.x,elem.y);
				i++;
			}
			/**标志改变.*/
			this.witchState = !this.witchState;
		}
		
		public function switchState():void {
			if (this.otherXML!=null) {
				if (witchState) {
					this.moveTo(this.otherXML);
				} else {
					this.moveTo(this.xml);
				}
			}
		}
	}
}

 做了一下XML的读取了存储操作

过程大概是这样的

 

首先有个XML是存储各个元素的坐标,然后初始化的时候读入...

当各元素状态改变了,需要重置的时候

就以当前各元素位置构造一个XML存储当前状态

以便之后切换

 

调用代码:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application 
	xmlns:mx="http://www.adobe.com/2006/mxml" 
	xmlns:view="com.emavaj.myfriend.view.*"
	layout="absolute" minWidth="955" minHeight="600"
	creationComplete="initApp()"
>
	<mx:Script>
		<![CDATA[
			import com.emavaj.myfriend.layout.IcomLayoutManager;
			import com.emavaj.myfriend.view.FriendIcom;
			/**初始化.*/
			public function initApp():void {
				IcomLayoutManager.getInstance().createElem("com/emavaj/myfriend/data/iconlayout.xml",main);
			}
			
			/**重置数据.*/
			public function restart():void {
				IcomLayoutManager.getInstance().restart();
			}
			
			/**切换状态.*/
			public function switchState():void {
				IcomLayoutManager.getInstance().switchState();
			}
		]]>
	</mx:Script>
	<mx:ViewStack width="950" height="600">
		<mx:Canvas width="100%" height="100%" id="main" fontSize="14">
			<mx:Button x="884.8" y="563.8" label="重置" click="restart()"/>
			<mx:Button x="791.9" y="563.8" label="状态切换" click="switchState()"/>
		</mx:Canvas>
	</mx:ViewStack>
	
</mx:Application>

 

效果在附近...

 

PS : 其实就是练练手XML和拖拽,还有一些效果的使用...

 

 

0
1
分享到:
评论

相关推荐

    Flex翻书特效

    它可能包含了书籍的初始化、页面布局、翻页动画以及其他与书籍操作相关的逻辑。 2. **Chain.as**:可能是一个链状结构的类,用于表示连续的页面。链式结构可以方便地处理连续翻页的效果,确保相邻页面之间的平滑...

    flex 拓扑图dome

    5. **动画和交互性**:Flex提供了强大的动画功能,可以创建平滑的过渡效果,使得拓扑图中的元素可以动态地展开、收缩或移动。此外,可以通过添加交互性,让用户能够通过拖放等方式改变拓扑结构。 6. **数据驱动**:...

    flex实现翻书效果

    通过改变速度的变化率,可以使得动画在起始和结束时有加速度,中间平滑过渡,从而模拟真实物体的物理运动。 4. **自定义组件**:由于Flex的标准组件库中没有现成的翻书组件,我们需要创建一个自定义组件来实现这一...

    Flex浏览杂志特效

    它允许开发者以XML格式定义组件布局和属性,与后台数据绑定,简化UI设计。 - ActionScript 3.0:Flex3.0基于AS3,这是一种面向对象的脚本语言,提供了更高效、更严格的类型检查和垃圾回收机制,提高了代码性能。 -...

    flex,As实现的翻书效果的源代码

    这种动态性是通过计算书页在不同阶段的位置和旋转角度来实现的,这需要精确的数学计算和动画帧的平滑过渡。 在压缩包中的"翻书效果"文件很可能包含了以下内容: 1. 源代码文件:AS3类文件,可能命名为BookFlip.as或...

    CSS + Js实现图片水平滚动

    4. **动画(Animation)**:`@keyframes`规则定义了动画从开始到结束的状态变化。通过应用`animation`属性,我们可以让图片根据预定义的步骤平滑移动。 然后,JavaScript(Js)将负责交互逻辑,如下所示: 1. **...

    flash 音乐播放器源码 flashbuilder版

    7. **动画效果**:Flash擅长创建动态效果,源码中可能包含一些过渡动画,如按钮按下效果、进度条变化等。 8. **错误处理**:良好的代码应该能处理各种异常情况,例如音乐文件加载失败或播放过程中出现问题。源码应...

    Xamarin_Forms___Xuzzle_picture_game_Xamarin_forms_picture_xuzzle

    此外,标签“motionpath”可能意味着游戏包含了动画效果,例如碎片滑动时的平滑过渡,这可以通过使用 Xamarin.Forms 的 Animation 类实现。 4. **布局设计与响应式UI** 游戏界面的布局应适应不同设备的屏幕尺寸和...

    web前端面试题

    - **动画和过渡**:使用`@keyframes`定义动画步骤,通过`transition`属性实现平滑的过渡效果。 - **响应式设计**:通过媒体查询(`@media`)调整不同屏幕尺寸下的布局。 - **多列布局**:使用`column-count`和`column-...

    flash 3d照片墙,带源码

    6. **动画和时间轴控制**: Flash的动画系统允许通过时间轴控制对象的运动,可以创建平滑的3D过渡效果。同时,ActionScript也可以实现基于帧的或基于时间的动画控制。 7. **内存管理和性能优化**: 由于3D照片墙可能...

Global site tag (gtag.js) - Google Analytics