Показать сообщение отдельно
Старый 27.08.2013, 09:11
bifidokk вне форума Посмотреть профиль Отправить личное сообщение для bifidokk Найти все сообщения от bifidokk
  № 8  
Ответить с цитированием
bifidokk
 
Аватар для bifidokk

Регистрация: Jan 2011
Сообщений: 200
Код 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;
		}
	}