/asutil/style/ShadowColor.as
http://asutil.googlecode.com/ · ActionScript · 265 lines · 163 code · 25 blank · 77 comment · 45 complexity · 3c5b281d53a0a5b4e99dc23e83eb74d8 MD5 · raw file
- package asutil.style
- {
- /**
- * ??????
- */
- public class ShadowColor
- {
- import flash.display.DisplayObject;
- import flash.geom.ColorTransform;
-
- import asutil.construct.Map;
- import asutil.construct.impl.SimpleMap;
- import asutil.job.Job;
- import asutil.job.JobTask;
- import asutil.common.ASLog;
-
- /**
- * ??job
- */
- private var myJob:Job;
- /**
- * ???
- * KEY - ??name
- * value- ??ID
- */
- private static var threadLocal:Map = new SimpleMap;
- /**
- * ??
- */
- private const logger:ASLog = ASLog.getLogger(this);
- /**
- * ???????255????256??????
- */
- private static const COMPARE_SAME:Number = 256;
- /**
- * ???????????????
- */
- private var isLoop:Boolean = false;
- /**
- *???????
- * ?????????????Number?????????????
- */
- private var tgColorIndex:Object= new Object;
- /**
- * ????
- */
- private var targetColorArray:Array = new Array;
- /**
- * ???????
- */
- private var shadowEles:Array = new Array;
-
- /**
- * ??????
- */
- public function ShadowColor(argObject:Object):void{
- //?????????
- if(null == argObject.shadowEles || null == argObject.targetColorArray ){
- throw new Error("Invaild para object.");
- }
- this.shadowEles = argObject.shadowEles;
- this.targetColorArray = argObject.targetColorArray;
-
- //??????
- var fadeDelay:Number;
- if(null != argObject.fadeDelay){
- fadeDelay = new Number(argObject.fadeDelay);
- }else{
- fadeDelay = 50;
- }
- if(null != argObject.isLoop ){
- this.isLoop = argObject.isLoop ;
- }
-
- tgColorIndex['value'] = new Number(0)
-
- var fadeTask:JobTask = new JobTask({
- doWhat : fadePortal,
- argArray : new Array( threadLocal,shadowEles,targetColorArray,tgColorIndex)
- })
-
- initColor(this.shadowEles);
- myJob = new Job({
- interval:fadeDelay,
- isLoop:true,
- step:5
- });
- myJob.addTask(fadeTask);
- }
-
- /**
- * ??
- */
- public function play():void{
- myJob.start();
- }
- /**
- * ??????????????
- */
- public function stopAtColor(color:String):void{
- myJob.sleep();
-
- //?????????
- for each(var ele:DisplayObject in shadowEles){
- var temp:ColorTransform = ele.transform.colorTransform;
- temp.color = new uint(color) ;
- ele.transform.colorTransform = temp;
- }
- }
-
- /**
- * ????????threadLocal??????task stop
- */
- public function stopShadow():void{
- this.myJob.stop();
-
- //???threadLocal??
- for each(var ele:DisplayObject in shadowEles){
- threadLocal.remove(ele.name);
- }
-
- }
- /**
- * ???????????
- */
- public function addColor(newColor:String):void{
- this.targetColorArray.push(newColor);
- }
-
- /**
- * ??????
- */
- public function fadePortal(threadLocal:Map,shadowEles:Array,targetColorArray:Array,tgColorIndex:Object):void{
- for each(var ele:DisplayObject in shadowEles){
- fadeFunction(threadLocal,ele ,targetColorArray,tgColorIndex);
- }
- }
- /**
- * ?????
- */
- private function fadeFunction(threadLocal:Map,disO:DisplayObject,targetColorArray:Array,tgColorIndex:Object):void{
-
- var index:Number = tgColorIndex['value'];
- //??????????
- if(targetColorArray.length == index){
- //????????0??????
- if(true == this.isLoop){
- index = 0;
- tgColorIndex['value'] = index;
- }else{
- //??????
- threadLocal.remove(disO.name);
- myJob.stop();
- }
- }
-
- var targetCT:ColorTransform = reCaulateTgColor(targetColorArray,index);
- if(0 == targetCT.color){
- threadLocal.remove(disO.name);
- myJob.stop();
- }
-
- if(true == isObjctInRunning(threadLocal,disO)){
- var tR:Number = targetCT.redOffset;
- var tG:Number = targetCT.greenOffset;
- var tB:Number = targetCT.blueOffset;
- //?????????
- var isFinished:Boolean = fadeProcess(disO,tR,tG,tB);
- if(true == isFinished){
- tgColorIndex['value'] = tgColorIndex['value'] + 1;
- }
- }
- }
-
- /**
- * ??????
- */
- private function reCaulateTgColor(colorArray:Array,colorIndex:Number):ColorTransform{
- var targetCT:ColorTransform = new ColorTransform;
- targetCT.color = colorArray[colorIndex];
- return targetCT;
- }
-
- /**
- * ??????
- * ??DisplyObject????????????????????????
- * ??????DisplyObject?????
- */
- private function isObjctInRunning(threadLocal:Map,disO:Object):Boolean{
- if(null == threadLocal.getValue(disO.name) ){
- // logger.debug("Start thread~~~~~~~~~~~~~~~~~~~~~~" + myThread);
- threadLocal.put(disO.name,myJob.getThreadId())
- return true;
- }
-
- var runningThread:uint = threadLocal.getValue(disO.name) as uint ;
- if(runningThread == myJob.getThreadId()){
- return true;
- }
-
- return false;
- }
- /**
- * ????
- * @retrun ?????????
- */
- private function fadeProcess(disO:DisplayObject,tR:Number,tG:Number,tB:Number):Boolean{
- // logger.info("Run~~~~~~~~~~~~~~~~~~~~~~" + myThread);
- var curCT:ColorTransform = disO.transform.colorTransform;
- var curR:Number = curCT.redOffset;
- var curG:Number = curCT.greenOffset;
- var curB:Number = curCT.blueOffset;
-
- var nR:Number = changeColorProcess(curR,tR);
- var nCT:ColorTransform = disO.transform.colorTransform;
- if(COMPARE_SAME != nR){
- nCT.redOffset = nR
- }
- var nG:Number = changeColorProcess(curG,tG);
- if(COMPARE_SAME != nG){
- nCT.greenOffset= nG
- }
- var nB:Number = changeColorProcess(curB,tB);
- if(COMPARE_SAME != nB){
- nCT.blueOffset = nB
- }
- disO.transform.colorTransform = nCT;
-
- nCT = null;//let gc go its work
-
- if(COMPARE_SAME == nR && COMPARE_SAME == nG && COMPARE_SAME ==nB){
- // logger.info("Clear: ~~~~~~~~~~~~~~~~~~" + myThread)
- return true;
- }
- return false;
- }
-
- /**
- * ??????????color??????null?????????????color
- */
- private function initColor(shadowEles:Array):void
- {
- for each(var disO:DisplayObject in shadowEles){
- var colorInfo:ColorTransform = disO.transform.colorTransform;
- if(0 == colorInfo.color){
- colorInfo.color = 0x999999;
- disO.transform.colorTransform = colorInfo;
- }
- }
- }
-
- private function changeColorProcess(curCol:Number,toCol:Number):Number{
- if(curCol == toCol){
- return COMPARE_SAME;
- }
- else if(curCol > toCol){
- return curCol - 1;
- }
- else if(curCol < toCol){
- return curCol + 1;
- }
- return COMPARE_SAME;
- }
- }
- }