package com.lc.utils { import flash.accessibility.Accessibility; import flash.display.Graphics; import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Point; public class CircleSlider extends MovieClip { //settings public var value : Number = 0; private var angleMin : Number; private var angleMax : Number; private var radius : int = 20; private var initValue : Number; //elements private var cursor : MovieClip = new MovieClip(); private var centre : Sprite = new MovieClip(); private var circle : Sprite = new Sprite(); //style private var _colorBorderCircle : uint = 0x000000; private var _colorCentreCircle : uint = 0xcccccc; private var _isFillCircle : Boolean = false; private var _thicknessBorderCircle : Number = 2; private var _colorBorderCursor : uint = 0xff6600; private var _thicknessBorderCursor : Number = 2; private var _colorCursor : Number = 2; private var _radiusCursor : Number = 10; public function CircleSlider(_radius:Number, _angleMin:Number, _angleMax:Number, _initValue:Number, oStyleSlider:Object){ if(oStyleSlider){ _colorBorderCircle = oStyleSlider.colorBorderCircle; _colorCentreCircle = oStyleSlider.colorCentreCircle; _isFillCircle = oStyleSlider.isFillCircle; _thicknessBorderCircle = oStyleSlider.thicknessBorderCircle; _colorCursor = oStyleSlider.colorCursor; _radiusCursor = oStyleSlider.radiusCursor; _colorBorderCursor = oStyleSlider.colorBorderCursor; _thicknessBorderCursor = oStyleSlider.thicknessBorderCursor; } radius = _radius; angleMin = _angleMin; if(angleMin<0) angleMin=0; if(angleMin>360) angleMin=360; angleMax = _angleMax; if(angleMax<0) angleMax=0; if(angleMax>360) angleMax=360; initValue = _initValue; if(initValue<0) initValue=0; if(initValue>100) initValue=100; //transformation du pourcentage en valeur initValue = (angleMax-angleMin) * initValue; builtItem(); } private function builtItem(){ //circle var minInRadian = Math.PI * 2 * (angleMin / 360); var maxInRadian = Math.PI * 2 * (angleMax / 360); var bgTransparent:MovieClip = new MovieClip(); bgTransparent.graphics.beginFill(0xff6600,0) bgTransparent.graphics.drawRect(-radius-radius/2,-radius-radius/2,radius*3,radius*3) this.addChild(bgTransparent); if(_isFillCircle==true){ circle.graphics.beginFill(_colorCentreCircle,1) } if(_thicknessBorderCircle>0){ circle.graphics.lineStyle(_thicknessBorderCircle,_colorBorderCircle,1); } if(_isFillCircle==true){ circle.graphics.lineTo(0, 0); } drawArc(0, 0,minInRadian, maxInRadian, radius, 1,circle.graphics); if(_isFillCircle==true){ circle.graphics.lineTo(0, 0); } circle.graphics.endFill(); this.addChild(circle); //centre centre.graphics.beginFill(0x000000,0); centre.graphics.drawCircle(0,0,0); centre.graphics.endFill(); this.addChild(centre); //cursor cursor.graphics.beginFill(_colorCursor,1) if(_thicknessBorderCursor>0){ cursor.graphics.lineStyle(_thicknessBorderCursor,_colorBorderCursor,1) } cursor.graphics.drawCircle(0,0,_radiusCursor) cursor.graphics.endFill(); this.addChild(cursor); cursor.mouseChildren = false; cursor.buttonMode = true; cursor.useHandCursor = true; setPosition(cursor,centre,radius,initValue); cursor.addEventListener(MouseEvent.MOUSE_DOWN,onDown , false , 0 , true); } private function onDown(e:MouseEvent):void{ addEventListener(MouseEvent.MOUSE_UP,onUp , false , 0 , true); addEventListener(Event.ENTER_FRAME,oef , false , 0 , true); } private function onUp(e:MouseEvent):void{ removeEventListener(Event.ENTER_FRAME,oef); removeEventListener(MouseEvent.MOUSE_UP,onUp) } private function setValue(_value:Number):void{ value = _value/100; this.dispatchEvent(new Event("onValueChange")); } public function getValue():Number{ return value; } //update the slider private function oef(e:Event):void{ var myAngle = returnAngle(centre,mouseX,mouseY) var _value:Number; if(myAngle<0) myAngle=360+myAngle if(myAngle>angleMin && myAngle350 ){ _value = 0 }else if(myAngle>=angleMax ){ _value = 100 } setValue(_value) } //return cursor angle private function returnAngle(centre:Sprite,mousex:Number,mousey:Number):Number{ var dx:Number = mousex - centre.x; var dy:Number = mousey - centre.y; var angle:Number = Math.atan2(dy,dx); angle /= Math.PI /180 ; return angle; } //set cursor position private function setPosition(mc:MovieClip,centre:Sprite,dist:Number,angle:Number):void{ var rad:Number = Math.PI/180 * angle; var cos:Number = Math.cos(rad) * dist; var sin:Number = Math.sin(rad) * dist; mc.x = centre.x + cos; mc.y = centre.y + sin; } //drawing the circle private function drawArc(centerX:Number, centerY:Number, startAngle:Number, endAngle:Number, radius:Number, direction:Number, _target:Graphics) { var difference:Number = Math.abs(endAngle - startAngle); var divisions:Number = Math.floor(difference / (Math.PI / 4))+1; var span:Number = direction * difference / (2 * divisions); var controlRadius:Number = radius / Math.cos(span); var controlPoint:Point; var anchorPoint:Point; _target.moveTo(centerX + (Math.cos(startAngle)*radius), centerY + Math.sin(startAngle)*radius); for(var i:Number=0; i