ColorHSV ProjectNya forked:0favorite:4lines:600license : MIT License modified : 2010-10-13 15:02:17 Embed Tweet //////////////////////////////////////////////////////////////////////////////// // ColorHSV //////////////////////////////////////////////////////////////////////////////// package { import flash.display.Sprite; import flash.display.Shape; import flash.events.MouseEvent; import flash.geom.ColorTransform; import frocessing.color.ColorHSV; [SWF(backgroundColor="#FFFFFF", width="465", height="465", frameRate="30")] public class Main extends Sprite { private var color:ColorHSV; private var colorTrans:ColorTransform; private var shape:Shape; private var txt:Label; public function Main() { //Wonderfl.capture_delay(1); init(); } private function init():void { shape = new Shape(); shape.graphics.beginFill(0x000000); shape.graphics.drawRect(0, 0, 250, 250); shape.graphics.endFill(); addChild(shape); shape.x = 107; shape.y = 62; // var controller1:Wheel = new Wheel(); controller1.x = 67; controller1.y = 340; addChild(controller1); controller1.init({label: "hue", init: 0}); controller1.addEventListener(CompoEvent.CHANGE, change1, false, 0, true); // var controller2:Slider = new Slider(); controller2.x = 187; controller2.y = 340; addChild(controller2); controller2.init({label: "saturation", width: 200, unit: 0.01, min: 0, max: 1, grid: 10, init: 1}); controller2.addEventListener(CompoEvent.CHANGE, change2, false, 0, true); // var controller3:Slider = new Slider(); controller3.x = 187; controller3.y = 400; addChild(controller3); controller3.init({label: "value", width: 200, unit: 0.01, min: 0, max: 1, grid: 10, init: 1}); controller3.addEventListener(CompoEvent.CHANGE, change3, false, 0, true); // var label:Label = new Label(100, 20, 12, Label.CENTER); addChild(label); label.x = 182; label.y = 12; label.textColor = 0x666666; label.text = "Color"; txt = new Label(80, 20, 12, Label.LEFT); addChild(txt); txt.x = 202; txt.y = 32; txt.textColor = 0x000000; //txt.text = "0xFF0000"; // color = new ColorHSV(0, 1, 1); colorTrans = new ColorTransform(); apply(); } private function change1(evt:CompoEvent):void { color.h = evt.value; apply(); } private function change2(evt:CompoEvent):void { color.s = evt.value; apply(); } private function change3(evt:CompoEvent):void { color.v = evt.value; apply(); } private function apply():void { colorTrans.color = color.value; shape.transform.colorTransform = colorTrans; txt.text = colorToRGB(color.value); } private function colorToRGB(c:uint):String { var r:Number = (c & 0xFF0000) >> 16; var g:Number = (c & 0x00FF00) >> 8; var b:Number = (c & 0x0000FF); var rgb:String = ("00000" + c.toString(16)).substr(-6).toUpperCase(); return "0x" + rgb; } } } ////////////////////////////////////////////////// // Labelクラス ////////////////////////////////////////////////// import flash.display.Sprite; import flash.text.TextField; import flash.text.TextFieldType; import flash.text.TextFieldAutoSize; import flash.text.AntiAliasType; import flash.text.TextFormat; import flash.text.TextFormatAlign; class Label extends Sprite { private var txt:TextField; private static var fontType:String = "_ゴシック"; private var _width:uint = 20; private var _height:uint = 20; private var size:uint = 12; public static const LEFT:String = TextFormatAlign.LEFT; public static const CENTER:String = TextFormatAlign.CENTER; public static const RIGHT:String = TextFormatAlign.RIGHT; public function Label(w:uint, h:uint, s:uint = 12, align:String = LEFT) { _width = w; _height = h; size = s; draw(align); } private function draw(align:String):void { txt = new TextField(); addChild(txt); txt.width = _width; txt.height = _height; txt.autoSize = align; txt.type = TextFieldType.DYNAMIC; txt.selectable = false; //txt.embedFonts = true; //txt.antiAliasType = AntiAliasType.ADVANCED; var tf:TextFormat = new TextFormat(); tf.font = fontType; tf.size = size; tf.align = align; txt.defaultTextFormat = tf; textColor = 0x000000; } public function set text(param:String):void { txt.text = param; } public function set textColor(param:uint):void { txt.textColor = param; } } ////////////////////////////////////////////////// // Wheelクラス ////////////////////////////////////////////////// import flash.display.Sprite; import flash.display.Shape; import flash.text.TextField; import flash.text.TextFieldType; import flash.text.AntiAliasType; import flash.text.TextFieldAutoSize; import flash.text.TextFormat; import flash.text.TextFormatAlign; import flash.filters.DropShadowFilter; import flash.geom.ColorTransform; import flash.events.Event; import flash.events.MouseEvent; class Wheel extends Sprite { private var base:Sprite; private var thumb:Sprite; private var point:Shape; private var hit:Shape; private var title:TextField; private var txt:TextField; private var label:String = ""; private static var fontType:String = "_ゴシック"; private static var __width:uint = 90; private static var _height:uint = 85; private static var tHeight:uint = 20; private static var bColor:uint = 0xFFFFFF; private static var cColor:uint = 0x999999; private static var sColor:uint = 0x000000; private static var tColor:uint = 0x666666; private static var pColor:uint = 0x666666; private static var offColor:uint = 0xCCCCCC; private static var cColorTrans:ColorTransform; private static var pColorTrans:ColorTransform; private static var offColorTrans:ColorTransform; private var zero:Number = 0; private var angle:Number = 0; private var shade:DropShadowFilter; private var initValue:Number; private var value:Number; private var _enabled:Boolean = true; public function Wheel() { } public function init(option:Object):void { if (option.label != undefined) label = option.label; if (option.zero != undefined) zero = option.zero; if (option.angle != undefined) angle = option.angle; value = initValue = angle; draw(); } private function draw():void { shade = new DropShadowFilter(1, 90, sColor, 0.4, 4, 4, 2, 3, false, false); cColorTrans = new ColorTransform(); cColorTrans.color = cColor; pColorTrans = new ColorTransform(); pColorTrans.color = pColor; offColorTrans = new ColorTransform(); offColorTrans.color = offColor; base = new Sprite(); thumb = new Sprite(); point = new Shape(); hit = new Shape(); title = new TextField(); txt = new TextField(); addChild(base); base.addChild(thumb); thumb.addChild(point); thumb.addChild(hit); addChild(title); addChild(txt); addChild(thumb); base.x = thumb.x = 50; base.y = thumb.y = 55; createDonut(base, 30, 10); base.filters = [shade]; point.x = 20; createCircle(point, 5, bColor, 1); hit.x = 20; createCircle(hit, 10, bColor, 0); title.height = tHeight-1; title.type = TextFieldType.DYNAMIC; title.selectable = false; //title.embedFonts = true; //title.antiAliasType = AntiAliasType.ADVANCED; title.textColor = tColor; title.autoSize = TextFieldAutoSize.LEFT; var tfl:TextFormat = new TextFormat(); tfl.font = fontType; tfl.size = 12; tfl.align = TextFormatAlign.LEFT; title.defaultTextFormat = tfl; title.text = label; txt.x = 50; txt.width = 40; txt.height = tHeight-1; txt.selectable = false; //txt.embedFonts = true; //txt.antiAliasType = AntiAliasType.ADVANCED; var tfr:TextFormat = new TextFormat(); tfr.font = fontType; tfr.size = 12; tfr.align = TextFormatAlign.RIGHT; txt.defaultTextFormat = tfr; reset(); _up(); enabled = true; thumb.mouseChildren = false; } private function rollOver(evt:MouseEvent):void { _over(); } private function rollOut(evt:MouseEvent):void { _up(); } private function press(evt:MouseEvent):void { _down(); thumb.addEventListener(MouseEvent.MOUSE_UP, release, false, 0, true); stage.addEventListener(MouseEvent.MOUSE_UP, releaseOutside, false, 0, true); stage.addEventListener(MouseEvent.MOUSE_MOVE, change, false, 0, true); stage.addEventListener(Event.MOUSE_LEAVE, leave, false, 0, true); } private function release(evt:MouseEvent):void { _up(); checkValue(); var e:CompoEvent = new CompoEvent(CompoEvent.SELECT, value); dispatchEvent(e); thumb.removeEventListener(MouseEvent.MOUSE_UP, release); stage.removeEventListener(MouseEvent.MOUSE_UP, releaseOutside); stage.removeEventListener(MouseEvent.MOUSE_MOVE, change); stage.removeEventListener(Event.MOUSE_LEAVE, leave); } private function releaseOutside(evt:MouseEvent):void { _up(); checkValue(); var e:CompoEvent = new CompoEvent(CompoEvent.SELECT, value); dispatchEvent(e); thumb.removeEventListener(MouseEvent.MOUSE_UP, release); stage.removeEventListener(MouseEvent.MOUSE_UP, releaseOutside); stage.removeEventListener(MouseEvent.MOUSE_MOVE, change); stage.removeEventListener(Event.MOUSE_LEAVE, leave); } private function leave(evt:Event):void { _up(); checkValue(); var e:CompoEvent = new CompoEvent(CompoEvent.SELECT, value); dispatchEvent(e); thumb.removeEventListener(MouseEvent.MOUSE_UP, release); stage.removeEventListener(MouseEvent.MOUSE_UP, releaseOutside); stage.removeEventListener(MouseEvent.MOUSE_MOVE, change); stage.removeEventListener(Event.MOUSE_LEAVE, leave); } private function _up():void { point.transform.colorTransform = cColorTrans; } private function _over():void { point.transform.colorTransform = pColorTrans; } private function _down():void { point.transform.colorTransform = pColorTrans; } private function _off():void { point.transform.colorTransform = offColorTrans; txt.textColor = offColor; } private function change(evt:MouseEvent):void { _down(); thumb.rotation = Math.round(Math.atan2(base.mouseY, base.mouseX)/Math.PI*180); evt.updateAfterEvent(); checkValue(); var e:CompoEvent = new CompoEvent(CompoEvent.CHANGE, value); dispatchEvent(e); } private function checkValue():void { value = (thumb.rotation + 360 + 90 - zero)%360; txt.text = String(value); } public function get enabled():Boolean { return _enabled; } public function set enabled(param:Boolean):void { _enabled = param; if (!_enabled) _off(); thumb.buttonMode = _enabled; thumb.mouseEnabled = _enabled; thumb.useHandCursor = _enabled; if (_enabled) { thumb.addEventListener(MouseEvent.MOUSE_OVER, rollOver, false, 0, true); thumb.addEventListener(MouseEvent.MOUSE_OUT, rollOut, false, 0, true); thumb.addEventListener(MouseEvent.MOUSE_DOWN, press, false, 0, true); } else { thumb.removeEventListener(MouseEvent.MOUSE_OVER, rollOver); thumb.removeEventListener(MouseEvent.MOUSE_OUT, rollOut); thumb.removeEventListener(MouseEvent.MOUSE_DOWN, press); } } public function reset():void { value = initValue; thumb.rotation = value - 90 + zero; txt.text = String(value); } private function createCircle(target:Shape, r:uint, color:uint, alpha:Number):void { target.graphics.beginFill(color, alpha); target.graphics.drawCircle(0, 0, r); target.graphics.endFill(); } private function createDonut(target:Sprite, outer:uint, inner:uint):void { target.graphics.beginFill(bColor); target.graphics.drawCircle(0, 0, outer); target.graphics.drawCircle(0, 0, inner); target.graphics.endFill(); } } ////////////////////////////////////////////////// // Sliderクラス ////////////////////////////////////////////////// import flash.display.Sprite; import flash.display.Shape; import flash.text.TextField; import flash.text.TextFieldType; import flash.text.AntiAliasType; import flash.text.TextFieldAutoSize; import flash.text.TextFormat; import flash.text.TextFormatAlign; import flash.filters.DropShadowFilter; import flash.filters.GlowFilter; import flash.geom.Rectangle; import flash.geom.Matrix; import flash.display.GradientType; import flash.display.SpreadMethod; import flash.display.InterpolationMethod; import flash.events.Event; import flash.events.MouseEvent; class Slider extends Sprite { private var hole:Shape; private var line:Sprite; private var thumb:Sprite; private var light:Shape; private var shade:Shape; private var base:Shape; private var title:TextField; private var txt:TextField; private var label:String = ""; private static var fontType:String = "_ゴシック"; private var _width:uint = 100; private static var tHeight:uint = 20; private static var bHeight:uint = 30; private var grid:uint = 5; private static var bColor:uint = 0xFFFFFF; private static var tColor:uint = 0x666666; private static var gColor:uint = 0x999999; private static var mColor:uint = 0x333333; private static var bgColor:uint = 0x0099FF; private static var sColor:uint = 0x000000; private static var offColor:uint = 0x999999; private var unit:Number = 0.1; private var digit:int; private var min:Number = 0; private var max:Number = 100; private var initValue:Number = 0; private var blueGlow:GlowFilter; private var shadeDrop:DropShadowFilter; private var value:Number; private var _enabled:Boolean = true; public function Slider() { } public function init(option:Object):void { if (option.label != undefined) label = option.label; if (option.width != undefined) _width = option.width; if (option.unit != undefined) unit = option.unit; if (option.min != undefined) min = option.min; if (option.max != undefined) max = option.max; if (option.grid != undefined) grid = option.grid; if (option.init != undefined) initValue = option.init; digit = - Math.floor(Math.log(unit)*Math.LOG10E); draw(); } private function draw():void { shadeDrop = new DropShadowFilter(1, 90, sColor, 0.5, 4, 4, 2, 3, false, false); blueGlow = new GlowFilter(bgColor, 0.6, 5, 5, 2, 3, false, true); hole = new Shape(); line = new Sprite(); title = new TextField(); txt = new TextField(); thumb = new Sprite(); shade = new Shape(); light = new Shape(); base = new Shape(); addChild(hole); addChild(line); addChild(title); addChild(txt); addChild(thumb); thumb.addChild(shade); thumb.addChild(light); thumb.addChild(base); hole.y = bHeight; createGradientHole(hole, _width, 3); line.y = bHeight; createGrid(line); title.height = tHeight-1; title.type = TextFieldType.DYNAMIC; title.selectable = false; //title.embedFonts = true; //title.antiAliasType = AntiAliasType.ADVANCED; title.textColor = tColor; title.autoSize = TextFieldAutoSize.LEFT; var tfl:TextFormat = new TextFormat(); tfl.font = fontType; tfl.size = 12; tfl.align = TextFormatAlign.LEFT; title.defaultTextFormat = tfl; title.text = label; txt.x = 70; txt.width = 50; txt.height = tHeight-1; txt.selectable = false; //txt.embedFonts = true; //txt.antiAliasType = AntiAliasType.ADVANCED; var tfr:TextFormat = new TextFormat(); tfr.font = fontType; tfr.size = 12; tfr.align = TextFormatAlign.RIGHT; txt.defaultTextFormat = tfr; reset(); thumb.y = bHeight; createThumb(shade, 8, 20, 12, sColor); shade.filters = [shadeDrop]; createThumb(light, 8, 20, 12, bgColor); light.filters = [blueGlow]; createThumb(base, 8, 20, 12, bColor); _up(); enabled = true; thumb.mouseChildren = false; } private function rollOver(evt:MouseEvent):void { _over(); } private function rollOut(evt:MouseEvent):void { _up(); } private function press(evt:MouseEvent):void { _down(); var rect:Rectangle = new Rectangle(0, bHeight, _width, 0); thumb.startDrag(false, rect); thumb.addEventListener(MouseEvent.MOUSE_UP, release, false, 0, true); stage.addEventListener(MouseEvent.MOUSE_UP, release, false, 0, true); stage.addEventListener(Event.MOUSE_LEAVE, leave, false, 0, true); thumb.addEventListener(Event.ENTER_FRAME, change, false, 0, true); } private function release(evt:MouseEvent):void { _up(); thumb.stopDrag(); checkValue(); var e:CompoEvent = new CompoEvent(CompoEvent.SELECT, value); dispatchEvent(e); thumb.removeEventListener(MouseEvent.MOUSE_UP, release); stage.removeEventListener(MouseEvent.MOUSE_UP, release); stage.removeEventListener(Event.MOUSE_LEAVE, leave); thumb.removeEventListener(Event.ENTER_FRAME, change); } private function leave(evt:Event):void { _up(); thumb.stopDrag(); checkValue(); var e:CompoEvent = new CompoEvent(CompoEvent.SELECT, value); dispatchEvent(e); thumb.removeEventListener(MouseEvent.MOUSE_UP, release); stage.removeEventListener(MouseEvent.MOUSE_UP, release); stage.removeEventListener(Event.MOUSE_LEAVE, leave); thumb.removeEventListener(Event.ENTER_FRAME, change); } private function _up():void { light.visible = false; } private function _over():void { light.visible = true; } private function _down():void { light.visible = true; } private function _off():void { light.visible = false; txt.textColor = offColor; } private function change(evt:Event):void { _down(); checkValue(); var e:CompoEvent = new CompoEvent(CompoEvent.CHANGE, text); dispatchEvent(e); } private function checkValue():void { value = min + thumb.x/_width*(max-min); text = value; } public function get enabled():Boolean { return _enabled; } public function set enabled(param:Boolean):void { _enabled = param; if (!_enabled) _off(); thumb.buttonMode = _enabled; thumb.mouseEnabled = _enabled; thumb.useHandCursor = _enabled; if (_enabled) { thumb.addEventListener(MouseEvent.MOUSE_OVER, rollOver, false, 0, true); thumb.addEventListener(MouseEvent.MOUSE_OUT, rollOut, false, 0, true); thumb.addEventListener(MouseEvent.MOUSE_DOWN, press, false, 0, true); thumb.addEventListener(MouseEvent.MOUSE_UP, release, false, 0, true); } else { thumb.removeEventListener(MouseEvent.MOUSE_OVER, rollOver); thumb.removeEventListener(MouseEvent.MOUSE_OUT, rollOut); thumb.removeEventListener(MouseEvent.MOUSE_DOWN, press); thumb.removeEventListener(MouseEvent.MOUSE_UP, release); } } public function reset():void { thumb.x = _width*(initValue-min)/(max-min); value = initValue; text = value; } public function get text():Number { return Number(txt.text); } public function set text(param:Number):void { value = param; txt.text = Number(value.toFixed(digit)).toFixed(digit); } private function createGrid(target:Sprite):void { for (var n:uint = 0; n <= grid; n++) { var w:Number = _width/grid; if (n == 0 || n == grid*0.5 || n == grid) { createGridLine(target, w*n, mColor); var _txt:TextField = new TextField(); target.addChild(_txt); _txt.x = w*n - 20; _txt.y = 13; _txt.width = 40; _txt.height = 14; _txt.selectable = false; //_txt.embedFonts = true; //_txt.antiAliasType = AntiAliasType.ADVANCED; _txt.textColor = mColor; var tfc:TextFormat = new TextFormat(); tfc.font = fontType; tfc.size = 9; tfc.align = TextFormatAlign.CENTER; _txt.defaultTextFormat = tfc; if (n == 0) _txt.text = String(min); if (n == grid*0.5) _txt.text = String(min+(max-min)*0.5); if (n == grid) _txt.text = String(max); } else { createGridLine(target, w*n, gColor); } } } private function createThumb(target:Shape, w:uint, h:uint, y:uint, color:uint, alpha:Number = 1):void { target.graphics.beginFill(color, alpha); target.graphics.drawRoundRect(-w*0.5, -y, w, h, w); target.graphics.endFill(); } private function createGradientHole(target:Shape, w:uint, c:Number):void { var colors:Array = [0x000000, 0x000000]; var alphas:Array = [0.4, 0]; var ratios:Array = [0, 255]; var matrix:Matrix = new Matrix(); matrix.createGradientBox(w+c*2, c*2, 0.5*Math.PI, -c, -c); target.graphics.beginGradientFill(GradientType.LINEAR, colors, alphas, ratios, matrix, SpreadMethod.PAD, InterpolationMethod.RGB, 0); target.graphics.drawRoundRect(-c, -c, w+c*2, c*2, c*2); target.graphics.endFill(); } private function createGridLine(target:Sprite, x:uint, color:uint):void { target.graphics.lineStyle(0, color); target.graphics.moveTo(x, 8); target.graphics.lineTo(x, 12); } } ////////////////////////////////////////////////// // CompoEventクラス ////////////////////////////////////////////////// import flash.events.Event; class CompoEvent extends Event { public static const SELECT:String = "select"; public static const CHANGE:String = "change"; public var value:*; public function CompoEvent(type:String, value:*) { super(type); this.value = value; } public override function clone():Event { return new CompoEvent(type, value); } } Code Fullscreen Preview Fullscreen djankey kleinschmidt.. hacker_rs10v.. : color picker hsv OKASUKE : HSV HSV Event.MOUSE_LEAVE undefined target Math.min Event.CHANGE alpha apply TextFormatAlign.RIGHT inner value rgb TextFormatAlign.LEFT String Math.LOG10E GlowFilter Boolean ColorHSV InterpolationMethod.RGB Event.SELECT toFixed