取色器

取色器:

/**
 *
 * *-----------------------------*
 * |       *** 取色器 ***         |
 * *-----------------------------*
 *
 * 编辑修改收录:fengzi(疯子、wu341、wgq341)
 *
 * 不会写代码,我是代码搬运工。
 * 联系方式:QQ(493712833)。
 *
 * 随   笔: https://www.cnblogs.com/fengziwu/
 *
 * 版权协议:请自觉遵守LGPL协议,欢迎修改、复制、转载、传播给更多需要的人。
 * 免责声明:任何因使用此软件导致的纠纷与软件/程序开发者无关。
 * 日   期: 2019.05.08
 *
 * ---------------------- 实例 --------------------------- *
 * 实例ColorPicker
 * 鼠标按下色块,返回一个16进制颜色值
   import fengzi.colors.ColorPicker;
   var s:ColorPicker=new ColorPicker();
   addChild(s);
   s.addEventListener("color.down",colorDownHandler);
   function colorDownHandler(event:Event):void
   {
   trace(event.target.colorStr)
   }
*/



package fengzi.colors
{
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.events.Event;
	public class ColorPicker extends Sprite
	{
		static public const COLOR_DOWN:String = "color.down";
		private var colorarr:Array = [0x000000,0x333333,0x666666,0x999999,0xcccccc,0xffffff,0xff0000,0x00ff00,0x0000ff,0xffff00,0x00ffff,0xff00ff];
		private var rectW:int;
		private var rectH:int;
		//**** 每一个颜色块的边框颜色(可以修改的参数)
		private var borderColor:uint = 0x000000;

		private var colorTxt:String;

		/**
		* ColorPicker      取色器
		* @param           rectW           色块宽
		* @param           rectH           色块高
		*/
		public function ColorPicker(rectW:int=15,rectH:int=15):void
		{
			this.rectW = rectW;
			this.rectH = rectH;
			getColorSpr();
		}

		private function getColorSpr():void
		{
			//// 颜色的最大值,用于循环生成颜色块时候作为判断条件
			var RMax:uint = 255;
			var GMax:uint = 255;
			var BMax:uint = 255;
			var step:uint = 255 / 5;

			// 用于设置六个大的颜色块的区域坐标位置
			var areaX:int = 0;
			var areaY:int = 0;

			// 颜色选择器容器对象
			var colorP:Sprite = new Sprite  ;

			//// 循环生成每一个颜色对象
			for (var r:uint = 0; r <= RMax; r +=  step)
			{
				// 生成六大颜色区域
				var sp6:Sprite = new Sprite  ;
				colorP.addChild(sp6);

				// 用于设置每一个颜色块的坐标位置
				var rectX:int = 0;
				var rectY:int = 0;

				for (var g:uint = 0; g <= GMax; g +=  step)
				{
					for (var b:uint = 0; b <= BMax; b +=  step)
					{
						//// 生成单独的颜色块,并设置坐标位置
						var rectSP:Sprite = new Sprite  ;
						makeRect(rectSP,makeColor(r,g,b),borderColor,rectW,rectH);
						rectSP.x = rectX;
						rectSP.y = rectY;
						sp6.addChild(rectSP);

						rectY +=  rectH;
					}
					rectX +=  rectW;
					rectY = 0;
				}

				//// 设置六个颜色区域的坐标
				sp6.x = areaX % sp6.width * 3 + 15;
				sp6.y = areaY;
				areaX +=  sp6.width;
				areaY = Math.floor((areaX / sp6.height * 3)) * sp6.height;
			}
			for (var i:int = 0; i < colorarr.length; i++)
			{
				var s:Sprite = new Sprite  ;
				makeRect(s,colorarr[i],borderColor,rectW,rectH);
				s.y = rectH * i;
				colorP.addChild(s);
			}
			addChild(colorP);
		}

		private function makeRect(spr:Sprite,color:uint,bColor:uint,recW:int,recH:int):Sprite
		{
			spr.graphics.lineStyle(0.1,bColor);
			spr.graphics.beginFill(color);
			spr.graphics.drawRect(0,0,recW,recH);

			// 给每一个颜色块添加点击事件
			spr.name = String(color);
			addMouse(spr);

			return spr;
		}

		// 生成颜色
		private function makeColor(rr:uint,gg:uint,bb:uint):uint
		{
			return rr * 16 * 16 * 16 * 16 + gg * 16 * 16 + bb;
		}

		// 给每一个颜色块添加点击事件
		private function addMouse(spr:Sprite):void
		{
			// 不要用CLICK事件,因为鼠标点击和移动速度过快之后,用于按下和释放时候不在同一个对象,会导致事件侦听函数没有按照想象中那么执行
			spr.addEventListener(MouseEvent.MOUSE_DOWN,function ( eve : MouseEvent ) : void
			 {
			 var num : int = 6 - int( eve.currentTarget.name ).toString(16).length;
			 var str : String = "0x";
			 for ( var i : int = 0; i < num; i++ )
			 {
			 str += "0";
			 }
			 colorTxt= str + String( int( eve.currentTarget.name ).toString(16) ).toLocaleUpperCase();
			 dispatchEvent(new Event(COLOR_DOWN));
			 });
		}


		/***
		* @colorStr  返回一个16进制颜色值(0xff00ff)
		***/
		public function get colorStr():String
		{
			return colorTxt;
		}





	}

}

  

猜你喜欢

转载自www.cnblogs.com/fengziwu/p/10908949.html