//drawSector
public static function drawSector(graphics:Graphics, x:Number, y:Number, r:Number, R:Number, angle:Number, startA:Number,color:uint=0x000000,alpha:Number=1):void
{
graphics.clear();
graphics.lineStyle(1, color, alpha, true);
graphics.beginFill(color, alpha);
if (Math.abs(angle) > 360)
{
angle=360;
}
var n:Number=Math.ceil(Math.abs(angle) / 45);
var angleA:Number=angle / n;
angleA=angleA * Math.PI / 180;
startA=startA * Math.PI / 180;
var startB:Number=startA;
//起始边
graphics.moveTo(x + r * Math.cos(startA), y + r * Math.sin(startA));
graphics.lineTo(x + R * Math.cos(startA), y + R * Math.sin(startA));
//外圆弧
for (var i:int=1; i <= n; i++)
{
startA+=angleA;
var angleMid1:Number=startA - angleA / 2;
var bx:Number=x + R / Math.cos(angleA / 2) * Math.cos(angleMid1);
var by:Number=y + R / Math.cos(angleA / 2) * Math.sin(angleMid1);
var cx:Number=x + R * Math.cos(startA);
var cy:Number=y + R * Math.sin(startA);
graphics.curveTo(bx, by, cx, cy);
}
//内圆起点
graphics.lineTo(x + r * Math.cos(startA), y + r * Math.sin(startA));
//内圆弧
for (var j:int=n; j >= 1; j--)
{
startA-=angleA;
var angleMid2:Number=startA + angleA / 2;
var bx2:Number=x + r / Math.cos(angleA / 2) * Math.cos(angleMid2);
var by2:Number=y + r / Math.cos(angleA / 2) * Math.sin(angleMid2);
var cx2:Number=x + r * Math.cos(startA);
var cy2:Number=y + r * Math.sin(startA);
graphics.curveTo(bx2, by2, cx2, cy2);
}
//内圆终点
graphics.lineTo(x + r * Math.cos(startB), y + r * Math.sin(startB));
//完成
graphics.endFill();
}
package utils
{
import flash.display.Graphics;
import spark.components.Label;
import spark.primitives.supportClasses.FilledElement;
public class Sector extends FilledElement
{
private var graphics:Graphics;
[Bindable]
private var _r:Number;
protected var rChanged:Boolean;
[Bindable]
private var _R:Number;
protected var RChanged:Boolean;
[Bindable]
private var _angle:Number;
[Bindable]
private var _startA:Number;
[Bindable]
private var _color:uint;
[Bindable]
private var _alpha:Number;
[Bindable]
private var _label:String="";
protected var labelChanged:Boolean;
public function Sector()
{
//TODO: implement function
super();
}
public function get label():String
{
return _label;
}
public function set label(value:String):void
{
_label = value;
}
public function get color():uint
{
return _color;
}
public function set color(value:uint):void
{
_color=value;
}
public function get startA():Number
{
return _startA;
}
public function set startA(value:Number):void
{
_startA=value;
}
public function get angle():Number
{
return _angle;
}
public function set angle(value:Number):void
{
_angle=value;
}
public function get R():Number
{
return _R;
}
public function set R(value:Number):void
{
if (value == _r)
{
return;
}
_R=value;
rChanged=true;
this.invalidateProperties();
}
public function get r():Number
{
return _r;
}
public function set r(value:Number):void
{
if (value == _r)
{
return;
}
_r=value;
rChanged=true;
this.invalidateProperties();
}
override protected function draw(g:Graphics):void
{
this.graphics=g;
GraphicsUtil.drawSector(g, drawX + width / 2, drawY + height / 2, r, R, angle, startA, color, alpha);
}
override protected function commitProperties():void
{
super.commitProperties();
/*if (rChanged && this.graphics)
{
rChanged=false;
this.draw(this.graphics);
}*/
if (RChanged && this.graphics)
{
RChanged=false;
this.draw(this.graphics);
}
/*if (labelChanged)
{
labelChanged=false;
var label:Label=new Label();
label.text=this.label;
}*/
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
minWidth="955"
minHeight="600"
xmlns:utils="utils.*">
<s:layout>
<s:BasicLayout/>
</s:layout>
<fx:Script>
<![CDATA[
protected function RHSlider_changeHandler(event:Event):void
{
sector.R=HSlider1.value;
}
protected function HSlider2_changeHandler(event:Event):void
{
sector.R=HSlider2.value;
}
]]>
</fx:Script>
<fx:Declarations>
<!-- 将非可视元素(例如服务、值对象)放在此处 -->
</fx:Declarations>
<!--<utils:Sector id="sector1"
horizontalCenter="0"
verticalCenter="0"
height="60"
width="60"
R="60"
r="58"
angle="360"
startA="0"
color="0x675f5a"
alpha="1"/>-->
<s:HSlider id="HSlider1"
value="80"
minimum="50"
maximum="100"
change="RHSlider_changeHandler(event)"
stepSize="1"
x="284"
y="25"/>
<s:HSlider id="HSlider2"
value="60"
minimum="40"
maximum="80"
stepSize="1"
x="284"
y="44"
change="HSlider2_changeHandler(event)"/>
<s:HGroup x="301"
y="357"
width="200"
height="200">
<utils:Sector id="sector"
height="200"
width="200"
R="80"
r="60"
angle="360"
startA="0"
color="0x464646"
alpha="1"/>
</s:HGroup>
<s:HGroup x="301"
y="357"
width="200"
height="200">
<utils:Sector id="sector1"
height="200"
width="200"
R="60"
r="58"
angle="360"
startA="0"
color="0x616161"
alpha="1"/>
</s:HGroup>
<s:HGroup x="301"
y="357"
width="200"
height="200">
<utils:Sector id="sector2"
height="200"
width="200"
R="82"
r="80"
angle="360"
startA="0"
color="0x616161"
alpha="1"/>
</s:HGroup>
<s:HGroup x="301"
y="357"
width="200"
height="200">
<utils:Sector id="sector3"
height="200"
width="200"
R="58"
r="0"
angle="90"
startA="0"
color="0xffffff"
alpha="1"/>
</s:HGroup>
<s:HGroup x="301"
y="357"
width="200"
height="200">
<utils:Sector id="sector4"
height="200"
width="200"
R="58"
r="0"
angle="90"
startA="90"
color="0x097abb"
alpha="1"/>
</s:HGroup>
<s:HGroup x="301"
y="357"
width="200"
height="200">
<utils:Sector id="sector5"
height="200"
width="200"
R="58"
r="0"
angle="90"
startA="180"
color="0xffffff"
alpha="1"/>
</s:HGroup>
<s:HGroup x="301"
y="357"
width="200"
height="200">
<utils:Sector id="sector6"
height="200"
width="200"
R="58"
r="0"
angle="90"
startA="270"
color="0x097abb"
alpha="1"/>
</s:HGroup>
<s:Label x="351"
y="397"
text="B"
fontSize="24"
color="0xffffff"
fontWeight="bold"
rotation="-40"/>
<s:Label x="391"
y="377"
text="M"
fontSize="24"
color="0xffffff"
fontWeight="bold"/>
<s:Label x="441"
y="387"
text="W"
fontSize="24"
color="0xffffff"
fontWeight="bold"
rotation="40"/>
<s:HGroup x="466"
y="66"
width="150"
height="150">
<s:Rect width="100%" height="100%"
radiusX="8"
radiusY="8">
<s:fill>
<s:SolidColor color="0xf67600"/>
</s:fill>
</s:Rect>
</s:HGroup>
<s:HGroup x="391"
y="91"
width="200"
height="200">
<utils:Sector id="sector7"
height="200"
width="200"
R="100"
r="80"
angle="90"
startA="270"
color="0xffffff"
alpha="1"/>
</s:HGroup>
<s:HGroup x="391"
y="91"
width="200"
height="100">
<utils:Sector id="sector8"
height="200"
width="200"
R="60"
r="40"
angle="90"
startA="270"
color="0xffffff"
alpha="1"/>
</s:HGroup>
<s:HGroup x="401"
y="81"
width="200"
height="100">
<utils:Sector id="sector9"
height="200"
width="200"
R="10"
r="0"
angle="360"
startA="0"
color="0xffffff"
alpha="1"/>
</s:HGroup>
</s:Application>