
Код AS3:
public class Throbber extends Sprite
{
private static const RAD180:Number = -Math.PI;
private static const RAD:Number = 180 / RAD180;
private var _g:Graphics;
private var _outerRadius:Number;
private var _innerRadius:Number;
private var _color:uint;
private var _center:Number;
private var _controlOutRadius:Number;
private var _controlInnRadius:Number;
private var square:Sprite = new Sprite();
public function Throbber(outerRadius:Number, innerRadius:Number, color:uint)
{
_color = color;
_innerRadius = innerRadius;
_outerRadius = outerRadius;
_g = this.graphics;
_center = _outerRadius / 2;
square.graphics.beginFill(0, 0);
square.graphics.drawRoundRect(-10, -10, 53, 53, 10);
addChild(square);
}
public function update(rotation:Number, arc:Number) : void
{
_g.clear();
if (arc == 0)
{
return;
}
rotation /= RAD;
arc /= RAD;
// alias arc to 360 gradians
arc = arc % (RAD180 * 2);
// calculate fragments (18 gradians max at one step for cute round curve)
var frags:Number = Math.abs( Math.ceil(arc * 10 / RAD180) );
if (arc < 0) frags += 1;
var fragAngle:Number = arc / frags;
// control points radius
_controlOutRadius = _outerRadius / Math.cos( -fragAngle / 2);
_controlInnRadius = _innerRadius / Math.cos( -fragAngle / 2);
// start drawings
var startX:Number = _center + _outerRadius * Math.cos(rotation);
var startY:Number = _center + _outerRadius * Math.sin(rotation);
_g.beginFill(_color, 0.6);
_g.moveTo(startX, startY);
// outer outline
for (var i:uint = 1; i < frags + 1; i++)
{
var aA:Number = rotation + fragAngle * i;
var aX:Number = _center + _outerRadius * Math.cos(aA);
var aY:Number = _center + _outerRadius * Math.sin(aA);
var cA:Number = aA - fragAngle / 2;
var cX:Number = _center + _controlOutRadius * Math.cos(cA);
var cY:Number = _center + _controlOutRadius * Math.sin(cA);
_g.curveTo(cX, cY, aX, aY);
}
var endX:Number = _center + _innerRadius * Math.cos(rotation + arc);
var endY:Number = _center + _innerRadius * Math.sin(rotation + arc);
_g.lineTo(endX, endY);
// inner outline
for (var j:uint = 1; j < frags + 1; j++)
{
var jA:Number = aA - fragAngle * j;
var jX:Number = _center + _innerRadius * Math.cos(jA);
var jY:Number = _center + _innerRadius * Math.sin(jA);
var cjA:Number = jA + fragAngle / 2;
var cjX:Number = _center + _controlInnRadius * Math.cos(cjA);
var cjY:Number = _center + _controlInnRadius * Math.sin(cjA);
_g.curveTo(cjX, cjY, jX, jY);
}
_g.lineTo(startX, startY);
_g.endFill();
this.mask = square;
}
}