这篇文章是基于上篇文章
只是稍微复杂一点而已...
废话少说了,看代码:
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和拖拽,还有一些效果的使用...
分享到:
相关推荐
它可能包含了书籍的初始化、页面布局、翻页动画以及其他与书籍操作相关的逻辑。 2. **Chain.as**:可能是一个链状结构的类,用于表示连续的页面。链式结构可以方便地处理连续翻页的效果,确保相邻页面之间的平滑...
5. **动画和交互性**:Flex提供了强大的动画功能,可以创建平滑的过渡效果,使得拓扑图中的元素可以动态地展开、收缩或移动。此外,可以通过添加交互性,让用户能够通过拖放等方式改变拓扑结构。 6. **数据驱动**:...
通过改变速度的变化率,可以使得动画在起始和结束时有加速度,中间平滑过渡,从而模拟真实物体的物理运动。 4. **自定义组件**:由于Flex的标准组件库中没有现成的翻书组件,我们需要创建一个自定义组件来实现这一...
它允许开发者以XML格式定义组件布局和属性,与后台数据绑定,简化UI设计。 - ActionScript 3.0:Flex3.0基于AS3,这是一种面向对象的脚本语言,提供了更高效、更严格的类型检查和垃圾回收机制,提高了代码性能。 -...
这种动态性是通过计算书页在不同阶段的位置和旋转角度来实现的,这需要精确的数学计算和动画帧的平滑过渡。 在压缩包中的"翻书效果"文件很可能包含了以下内容: 1. 源代码文件:AS3类文件,可能命名为BookFlip.as或...
4. **动画(Animation)**:`@keyframes`规则定义了动画从开始到结束的状态变化。通过应用`animation`属性,我们可以让图片根据预定义的步骤平滑移动。 然后,JavaScript(Js)将负责交互逻辑,如下所示: 1. **...
7. **动画效果**:Flash擅长创建动态效果,源码中可能包含一些过渡动画,如按钮按下效果、进度条变化等。 8. **错误处理**:良好的代码应该能处理各种异常情况,例如音乐文件加载失败或播放过程中出现问题。源码应...
此外,标签“motionpath”可能意味着游戏包含了动画效果,例如碎片滑动时的平滑过渡,这可以通过使用 Xamarin.Forms 的 Animation 类实现。 4. **布局设计与响应式UI** 游戏界面的布局应适应不同设备的屏幕尺寸和...
- **动画和过渡**:使用`@keyframes`定义动画步骤,通过`transition`属性实现平滑的过渡效果。 - **响应式设计**:通过媒体查询(`@media`)调整不同屏幕尺寸下的布局。 - **多列布局**:使用`column-count`和`column-...
6. **动画和时间轴控制**: Flash的动画系统允许通过时间轴控制对象的运动,可以创建平滑的3D过渡效果。同时,ActionScript也可以实现基于帧的或基于时间的动画控制。 7. **内存管理和性能优化**: 由于3D照片墙可能...