forked from: カラーピッカー(MXML)

by hakerlab forked from カラーピッカー(MXML) (diff: 1)
♥0 | Line 157 | Modified 2015-10-20 19:40:12 | MIT License
play

ActionScript3 source code

/**
 * Copyright hakerlab ( http://wonderfl.net/user/hakerlab )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/OpRv
 */

<?xml version="1.0" encoding="utf-8"?>
<!-- forked from romatica's カラーピッカー(MXML) -->
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx"
               initialize="init()">
    <fx:Script>
        <![CDATA[
        
            import frocessing.color.ColorHSV;
            
            private const SW:int = 400;
            private const SH : int = 400;
            private const W:int = 300;
            private const H : int = 300;
            private var _g : Graphics;
            private var _color : ColorHSV;
            private function init():void{
                
                _color = new ColorHSV();
                _g = container.graphics;
                
                myStage.graphics.beginFill(0xaaaaaa);
                myStage.graphics.drawRect(0,0,SW,SH);
                myStage.graphics.endFill();
                myStage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
                myStage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
                drawHueBar();
                changeHue();
                drawPointer();
            }

            /**
             * スライダイベント
             */
            private function changeHue():void
            {
                _color.h =colorSlider.value;
                _g.clear();
                drawHueGrad( _color.value);
                drawBrightness();
                setColorText();
            }
            /**
             * 色相バーを作成
             */
            private function drawHueBar() : void
            {
                var g :Graphics= hueBar.graphics;
                for (var i : int =0; i < hueBar.height ; i++) {
                    _color.h =i/hueBar.height*360;
                    g.beginFill(_color.value);
                    g.drawRect(0,(hueBar.height-i),21,1);
                }
                g.endFill();
            }
            /**
             * 16進数カラーコード
             */
            private function setColorText() : void
            {
                 colorCode.text="0x"+getColorText();
            }

            private function getColorText() : String
            {
                var xx : Number = pointer.x - container.x ;
                var yy : Number = pointer.y - container.y ;
                var bmd : BitmapData = new BitmapData( W, H );
                bmd.draw( container );
                var col : Number = bmd.getPixel( xx, yy );
                //trace( col, " / " + xx, yy );
                bmd.dispose();
                var val16:String = col.toString(16);
                if(val16.length<6){
                    var max:int = 6-val16.length;
                    for (var i : int = 0; i < max; i++) {
                        val16 = "0"+val16;
                    }
                }
                
                return val16;
            }
            /**
             * ポインタ描く
             */
            private function drawPointer() : void
            {
                pointer.graphics.lineStyle(3.5,0x000000);
                pointer.graphics.drawCircle(0,0,10);
                pointer.graphics.lineStyle(1.5,0xffffff);
                pointer.graphics.drawCircle(0,0,10);
                pointer.graphics.endFill();
                pointer.x = W / 2 + container.x;
                pointer.y = H / 2 + container.y;
            }
            private function onMouseDown(event : MouseEvent) : void
            {
                if (!myStage.hasEventListener(  Event.ENTER_FRAME)) {
                    myStage.addEventListener( Event.ENTER_FRAME, onMouseEnter);
                }
            }
            private function moveStop():void
            {
                if (myStage.hasEventListener(  Event.ENTER_FRAME)) {
                    myStage.removeEventListener( Event.ENTER_FRAME, onMouseEnter);
                }
            }
            private function onMouseUp(event : MouseEvent) : void
            {
                moveStop();
            }
            
            private function onMouseEnter(event : Event) : void
            {
                pointer.x =mouseX;
                pointer.y = mouseY;
                if (pointer.x <= container.x ){
                    pointer.x = container.x;
                }
                if (pointer.x >= container.x +W){
                    pointer.x = container.x +W-1;
                }
                if (pointer.y <= container.y ){
                    pointer.y = container.y;
                }
                if (pointer.y >= container.y +H){
                    pointer.y = container.y +H-1;
                }
                //ドラッグステージ外に出た
                if (mouseX<=  myStage.x ||mouseX>=myStage.x+SW ||mouseY<=myStage.y || mouseY >myStage.y + SH){
                    moveStop();
                }
                setColorText();
            }

            /**
             * 彩度グラデーション
             */
            private function drawHueGrad(trgHue:Number = 0xff0000):void
            {
                var rect:Shape = new Shape();
                var colors:Array=[0xffffff,trgHue];
                var alphas:Array = [1, 1];
                var ratios:Array = [0,255];
                 var matrix:Matrix = new Matrix();
                matrix.createGradientBox(W, H, 0, 0, 0);
                _g.beginGradientFill(GradientType.LINEAR, colors, alphas, ratios, matrix, SpreadMethod.PAD, InterpolationMethod.RGB, 0);
                _g.drawRect(0, 0, W, H);
                _g.endFill();
            }
            /**
             * 明度グラデーション
             */
            private function drawBrightness() : void
            {
                var color:Array = [0x000000, 0x000000];
                var alpha:Array = [0, 1];
                var ratio:Array = [0, 255];
                var matrix:Matrix = new Matrix();
                matrix.createGradientBox(W, H, Math.PI*0.5, 0, 0);
                _g.beginGradientFill(GradientType.LINEAR, color, alpha, ratio,matrix, SpreadMethod.PAD, InterpolationMethod.RGB, 0);
                _g.drawRect(0, 0, W, H);
                _g.endFill();
            }
        
        ]]>
        
    </fx:Script>
        <mx:Canvas id ="myStage"  width="400"  height="400">
            <mx:Canvas id ="container" height="300" width="300" x="50" y="50"></mx:Canvas>
        </mx:Canvas>
        <mx:Canvas id="pointer" width="10" height="10"></mx:Canvas>
        
        <mx:Canvas id="sliderArea" x="420" y = "50">
        
            <mx:Canvas id="hueBar" width="15" height="300" ></mx:Canvas>
            
            <mx:Slider id="colorSlider" maximum="360" minimum="0" direction="vertical" snapInterval=".01"
                liveDragging="true"
                change ="changeHue()" 
                x="5"
                height = "300"
            />
        </mx:Canvas>
        
        <s:TextArea id="colorCode"
            width = "80"
            height = "18"
            x="360"
            y = "430" />
</s:Application>