
Код AS3:
package
{
import flash.display.GradientType;
import flash.display.Graphics;
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.filters.BevelFilter;
import flash.filters.DropShadowFilter;
import flash.geom.Matrix;
import flash.geom.Point;
public class Knob extends Sprite
{
private const RAD:Number = Math.PI / 180;
private var _knob:Sprite;
private var _knobAngleLast:Number = 0;
private var _handAngleStart:Number;
public function Knob()
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
//// Шкала 25 рисок
var scal:Shape = new Shape();
var sg:Graphics = scal.graphics;
sg.lineStyle(2, 0x666666);
for (var s:uint = 0; s < 250; s += 10)
{
var angle:Number = (150 + s) * RAD
var sp:Point = Point.polar(60, angle);
var sp2:Point = Point.polar(s % 20 ? 65 : 70, angle);
sg.moveTo(sp.x, sp.y);
sg.lineTo(sp2.x, sp2.y);
}
addChild(scal);
//// Ручка
_knob = new Sprite();
addChild(_knob);
var g:Graphics = _knob.graphics;
g.beginFill(0x000000);
for (var i:uint = 0; i < 360; i += 30)
{
var p:Point = Point.polar(45, i * RAD);
g.drawCircle(p.x, p.y, 10);
}
g.beginFill(0x000000);
g.drawCircle(0, 0, 50);
var matrix:Matrix = new Matrix();
matrix.createGradientBox(94, 94, 0, -47, -47);
g.beginGradientFill(GradientType.RADIAL, [0x000000, 0x101010], [1, 1], [210, 255], matrix);
g.drawCircle(0, 0, 48);
//// Риска на ручке, под 150 град для простоты расчета ограничения вращения
var p1:Point = Point.polar(20, 150 * RAD);
var p2:Point = Point.polar(45, 150 * RAD);
g.endFill();
g.lineStyle(3, 0x333333);
g.moveTo(p1.x, p1.y)
g.lineTo(p2.x, p2.y);
_knob.filters = [ new BevelFilter(25, 60, 0xFFFFFF, 0.5, 0x000000, 0.5, 25, 25, 0.5, 3), new DropShadowFilter(10, 60, 0x000000, 0.5, 12, 12, 1, 3) ];
_knob.addEventListener(MouseEvent.MOUSE_DOWN, handlerDown);
}
private function handlerDown(event:MouseEvent):void
{
_knobAngleLast = _knob.rotation;
_handAngleStart = Math.atan2(mouseY, mouseX) / RAD;
stage.addEventListener(MouseEvent.MOUSE_MOVE, handlerMove);
stage.addEventListener(MouseEvent.MOUSE_UP, handlerUp);
}
private function handlerUp(event:MouseEvent):void
{
stage.removeEventListener(MouseEvent.MOUSE_MOVE, handlerMove);
stage.removeEventListener(MouseEvent.MOUSE_UP, handlerUp);
}
private function handlerMove(event:MouseEvent):void
{
var handAngle:Number = Math.atan2(mouseY, mouseX) / RAD;
var delta:Number = _handAngleStart - handAngle;
_handAngleStart = handAngle;
_knob.rotation -= delta;
if (_knob.rotation < 0 && _knob.rotation > -(360 - 240) )
{
_knob.rotation = _knobAngleLast;
}
else
{
_knobAngleLast = _knob.rotation;
}
}
}
}

Код AS3:
package
{
import flash.display.Sprite;
import flash.events.Event;
public class Main extends Sprite
{
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
this.graphics.beginFill(0x444444);
this.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
var knob:Knob = new Knob();
addChild(knob);
knob.x = knob.y = 200;
}
}
}