您的位置:首页 > 其它

简单的as布局算法(包括 圆形,椭圆,弧形)

2010-12-02 15:16 513 查看
最近工作需要在学习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;
}
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐