最近工作需要在学习Flash 编程 工作主要涉及到的是一些元素之间关联连线,布局等算法。经过一段时间的摸索。总结了以下几种项目中常用的算法。废话不多说了。看码.
package com.triman.layout { import flash.geom.Point;
/** * 布局算法 常用的布局算法有 * 圆形布局 ,扇形布局 椭圆布局等。 * 其中圆布局是椭圆布局的一种特例。 * 所以椭圆布局继承了椭圆布局算法 * 而 椭圆布局是弧形的一种特例。 * * +Round * +Ellipse * +Camber * 这个是一个布局的抽象类 所有的布局算法都是继承它的。 * */ public class LayOut { //布局的类型 protected var type:String ;
//要布局的对象数据数组 protected var layoutEls:Array;
//布局中心点位置 protected var centerPoint:Point;
//分布开始角度 默认0度开始分布 protected var startAngle:Number = 0 ;
//每个元素之间的角度间隙 //通过计算得到 protected var disAngle:Number ;
public function layout():void{ // implements by child class ; } } }
|
| | package com.triman.layout { import com.triman.utils.Tools;
import flash.display.DisplayObject; import flash.geom.Point;
//圆形布局 public class CircleLayOut extends LayOut { //半径 因为X Y 方向半径都是一样的 //为了让这个变量可以让椭圆使用 所以使用 radiusX 好和 radiusY对应 protected var radiusX:Number;
public function CircleLayOut(centerPoint:Point,groupEls:Array,startAngle:Number,radius:Number) { this.centerPoint = centerPoint this.layoutEls = groupEls; this.startAngle = startAngle; this.radiusX = radius;
}
override public function layout():void{ var len:Number = this.layoutEls.length this.disAngle = 360 / len; for(var i:int=0;i<len;i++){ var tempRaian:Number = Tools.angle2Radian(this.startAngle); var node:DisplayObject = this.layoutEls[i] as DisplayObject; node.x = this.centerPoint.x + Math.cos(tempRaian)*this.radiusX; node.y = this.centerPoint.y + Math.sin(tempRaian)*this.radiusX; //角度增加 this.startAngle+=this.disAngle; } }
} } |
|
package com.triman.layout { import com.triman.utils.Tools;
import flash.display.DisplayObject; import flash.geom.Point;
//椭圆布局 是圆形布局的一种特殊表现 //区别在于具有 x y 两个方向的半径 public class EllipseLayOut extends CircleLayOut { //Y方向半径 protected var radiusY:Number;
public function EllipseLayOut(centerPoint:Point,groupEls:Array,startAngle:Number,radiusX:Number,radiusY:Number) { super(centerPoint,groupEls,startAngle,radiusX); this.radiusY = radiusY;
}
//布局算法 基本和圆形一样 override public function layout():void{ var len:Number = this.layoutEls.length; this.disAngle = 360/len; for(var i:int=0;i<len;i++){ var tempRaian:Number = Tools.angle2Radian(this.startAngle); var node:DisplayObject = this.layoutEls[i] as DisplayObject; node.x = this.centerPoint.x + Math.cos(tempRaian)*this.radiusX; node.y = this.centerPoint.y + Math.sin(tempRaian)*this.radiusY; //角度增加 this.startAngle+=this.disAngle; } }
} } |
| | package com.triman.layout { import com.triman.utils.Tools;
import flash.display.DisplayObject; import flash.geom.Point;
//扇形布局 public class CamberLayOut extends EllipseLayOut { //分布范围 如果90那么就是指从startAngle 开始到angelRange 这样以一个范围 protected var angelRange:Number;
public function CamberLayOut(centerPoint:Point,groupEls:Array,startAngle:Number,radiusX:Number,radiusY:Number,angelRange:Number) { this.type = "CamberLayOut"; super(centerPoint,groupEls,startAngle,radiusX,radiusY); this.angelRange = angelRange; }
override public function layout():void{ var len:Number = this.layoutEls.length; this.disAngle = this.angelRange / len; for(var i:int=0;i<len;i++){ var tempRaian:Number = Tools.angle2Radian(this.startAngle); var node:DisplayObject = this.layoutEls[i] as DisplayObject; node.x = this.centerPoint.x + Math.cos(tempRaian)*this.radiusX; node.y = this.centerPoint.y + Math.sin(tempRaian)*this.radiusY; //角度增加 this.startAngle+=this.disAngle; } }
} } |
|
|
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理