Actionscript颜色选择器

时间:2011-03-11 14:54:23

标签: actionscript-3

我正在尝试为我的应用程序创建一个Colorpicker控件。我更喜欢纯粹的动作。有人知道如何创建这样的选择器:http://parasolarchives.com/tools/colorpicker/ 最有趣的是我感兴趣的是如何绘制渐变,因为渐变具有饱和度,

2 个答案:

答案 0 :(得分:0)

我不确定这会太准确,但我想我可以给你一些想法:

你可以抓住你正在展示的那个相同的平方图像(或者就此而言的Photoshop),并改变它的色调以获得整个颜色范围。

如果你想绘制它,在数学上我认为它太难了...对于青色,例如,Y轴应控制所有通道中的最大颜色量,而X轴应该控制混合物中红色的比例。

答案 1 :(得分:0)

这是我自己使用的选择器,希望它有用:

package lazylib.ui.generated
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.display.GradientType;
    import flash.events.MouseEvent;
    import flash.geom.ColorTransform;
    import flash.geom.Matrix;
    import lazylib.broadcast.evts.ColorEvent;
    import lazylib.broadcast.Radio;
    /**
     * ...
     * @author www0z0k
     */
    public class Picker extends Sprite
    {
        private var bmpc: Bitmap;
        private var bmp:BitmapData;
        private var id:String;
        private var w:int;
        private var h:int;
        public static const COLOR_PICKED_EVT_TYPE: String = 'picked by picker';
        public function Picker(_id:String, _w:int = 256, _h:int = 256, _x:int = 0, _y:int = 0) 
        {
            id = _id;
            w = _w;
            h = _h;
            x = _x;
            y = _y;
            bmp = new BitmapData(w, h);
            bmpc = new Bitmap(bmp);
            addChild(bmpc);
            refillBmp(0x7f7f7f);

        }

        public function get ID():String { return id; }

        private function refillBmp(overColor:int = 0x7f7f7f, alphaStep:Number = 0.006):void {
            var rtspr:Sprite = new Sprite();
            var spr:Sprite = new Sprite();
            var colors:Array = new Array(0xff0000,0xff7f00,0xffff00,0x7fff00,0x00ff00, 0x00ff7f, 0x00ffff,0x007fff,0x0000ff, 0x7f00ff,0xff00ff, 0xff007f, 0xff0000);
            var alphas: Array = new Array(1,         1,      1,          1,         1,      1,    1,        1,         1,       1,       1,        1,        1);
            var ratios: Array = new Array(10,        30,    50,          70,        90,     110,   130,      150,       170,    190,    210,      230,       250);
            var matrix:Matrix = new Matrix();
            matrix.createGradientBox(w, h);
            spr.graphics.beginGradientFill(GradientType.LINEAR, colors, alphas, ratios, matrix);
            spr.graphics.drawRect(0, 0, w, h);
            spr.graphics.endFill();
            rtspr.addChild(spr);
            var spr2:Sprite = new Sprite();
            rtspr.addChild(spr2);
            var startA: Number = 1;
            for (var i:int = 0; startA > 0; i++) {
                startA -= alphaStep;//orig 0.004!!!
                spr2.graphics.lineStyle(1, overColor, startA);
                spr2.graphics.moveTo(0, h - i);
                spr2.graphics.lineTo(w, h - i);
            }
            bmp.draw(rtspr, new Matrix());  
            graphics.beginFill(0, 0);
            graphics.drawRect(0, 0, w, h);
            graphics.endFill();
            buttonMode = true;
            addEventListener(MouseEvent.CLICK, onClick);
        }

        public function adjustDarkness(percent:int):void {
            var colorValue: int = int(255 * percent / 100);
            var currentGray:int = colorValue + colorValue << 8 + colorValue << 16;
            refillBmp(colorValue);

        }

        private function onClick(e:MouseEvent):void {
            var col: int = bmp.getPixel(e.localX, e.localY);
            Radio.broadcast(new ColorEvent(COLOR_PICKED_EVT_TYPE + id, col));
            dispatchEvent(new ColorEvent(COLOR_PICKED_EVT_TYPE + id, col));
        }

    }

}

Radio是一个全球调度员类(如果您需要,则发布here),ColorEvent只是一个int 颜色的事件字段adjustDarkness通常从外部滚动条调用。如果需要一个工作实例,请告诉我。