/asutil/style/ShadowColor.as

http://asutil.googlecode.com/ · ActionScript · 265 lines · 163 code · 25 blank · 77 comment · 45 complexity · 3c5b281d53a0a5b4e99dc23e83eb74d8 MD5 · raw file

  1. package asutil.style
  2. {
  3. /**
  4. * ??????
  5. */
  6. public class ShadowColor
  7. {
  8. import flash.display.DisplayObject;
  9. import flash.geom.ColorTransform;
  10. import asutil.construct.Map;
  11. import asutil.construct.impl.SimpleMap;
  12. import asutil.job.Job;
  13. import asutil.job.JobTask;
  14. import asutil.common.ASLog;
  15. /**
  16. * ??job
  17. */
  18. private var myJob:Job;
  19. /**
  20. * ???
  21. * KEY - ??name
  22. * value- ??ID
  23. */
  24. private static var threadLocal:Map = new SimpleMap;
  25. /**
  26. * ??
  27. */
  28. private const logger:ASLog = ASLog.getLogger(this);
  29. /**
  30. * ???????255????256??????
  31. */
  32. private static const COMPARE_SAME:Number = 256;
  33. /**
  34. * ???????????????
  35. */
  36. private var isLoop:Boolean = false;
  37. /**
  38. *???????
  39. * ?????????????Number?????????????
  40. */
  41. private var tgColorIndex:Object= new Object;
  42. /**
  43. * ????
  44. */
  45. private var targetColorArray:Array = new Array;
  46. /**
  47. * ???????
  48. */
  49. private var shadowEles:Array = new Array;
  50. /**
  51. * ??????
  52. */
  53. public function ShadowColor(argObject:Object):void{
  54. //?????????
  55. if(null == argObject.shadowEles || null == argObject.targetColorArray ){
  56. throw new Error("Invaild para object.");
  57. }
  58. this.shadowEles = argObject.shadowEles;
  59. this.targetColorArray = argObject.targetColorArray;
  60. //??????
  61. var fadeDelay:Number;
  62. if(null != argObject.fadeDelay){
  63. fadeDelay = new Number(argObject.fadeDelay);
  64. }else{
  65. fadeDelay = 50;
  66. }
  67. if(null != argObject.isLoop ){
  68. this.isLoop = argObject.isLoop ;
  69. }
  70. tgColorIndex['value'] = new Number(0)
  71. var fadeTask:JobTask = new JobTask({
  72. doWhat : fadePortal,
  73. argArray : new Array( threadLocal,shadowEles,targetColorArray,tgColorIndex)
  74. })
  75. initColor(this.shadowEles);
  76. myJob = new Job({
  77. interval:fadeDelay,
  78. isLoop:true,
  79. step:5
  80. });
  81. myJob.addTask(fadeTask);
  82. }
  83. /**
  84. * ??
  85. */
  86. public function play():void{
  87. myJob.start();
  88. }
  89. /**
  90. * ??????????????
  91. */
  92. public function stopAtColor(color:String):void{
  93. myJob.sleep();
  94. //?????????
  95. for each(var ele:DisplayObject in shadowEles){
  96. var temp:ColorTransform = ele.transform.colorTransform;
  97. temp.color = new uint(color) ;
  98. ele.transform.colorTransform = temp;
  99. }
  100. }
  101. /**
  102. * ????????threadLocal??????task stop
  103. */
  104. public function stopShadow():void{
  105. this.myJob.stop();
  106. //???threadLocal??
  107. for each(var ele:DisplayObject in shadowEles){
  108. threadLocal.remove(ele.name);
  109. }
  110. }
  111. /**
  112. * ???????????
  113. */
  114. public function addColor(newColor:String):void{
  115. this.targetColorArray.push(newColor);
  116. }
  117. /**
  118. * ??????
  119. */
  120. public function fadePortal(threadLocal:Map,shadowEles:Array,targetColorArray:Array,tgColorIndex:Object):void{
  121. for each(var ele:DisplayObject in shadowEles){
  122. fadeFunction(threadLocal,ele ,targetColorArray,tgColorIndex);
  123. }
  124. }
  125. /**
  126. * ?????
  127. */
  128. private function fadeFunction(threadLocal:Map,disO:DisplayObject,targetColorArray:Array,tgColorIndex:Object):void{
  129. var index:Number = tgColorIndex['value'];
  130. //??????????
  131. if(targetColorArray.length == index){
  132. //????????0??????
  133. if(true == this.isLoop){
  134. index = 0;
  135. tgColorIndex['value'] = index;
  136. }else{
  137. //??????
  138. threadLocal.remove(disO.name);
  139. myJob.stop();
  140. }
  141. }
  142. var targetCT:ColorTransform = reCaulateTgColor(targetColorArray,index);
  143. if(0 == targetCT.color){
  144. threadLocal.remove(disO.name);
  145. myJob.stop();
  146. }
  147. if(true == isObjctInRunning(threadLocal,disO)){
  148. var tR:Number = targetCT.redOffset;
  149. var tG:Number = targetCT.greenOffset;
  150. var tB:Number = targetCT.blueOffset;
  151. //?????????
  152. var isFinished:Boolean = fadeProcess(disO,tR,tG,tB);
  153. if(true == isFinished){
  154. tgColorIndex['value'] = tgColorIndex['value'] + 1;
  155. }
  156. }
  157. }
  158. /**
  159. * ??????
  160. */
  161. private function reCaulateTgColor(colorArray:Array,colorIndex:Number):ColorTransform{
  162. var targetCT:ColorTransform = new ColorTransform;
  163. targetCT.color = colorArray[colorIndex];
  164. return targetCT;
  165. }
  166. /**
  167. * ??“????”
  168. * ??DisplyObject???????“??”???????????????
  169. * ??????DisplyObject??“???”
  170. */
  171. private function isObjctInRunning(threadLocal:Map,disO:Object):Boolean{
  172. if(null == threadLocal.getValue(disO.name) ){
  173. // logger.debug("Start thread~~~~~~~~~~~~~~~~~~~~~~" + myThread);
  174. threadLocal.put(disO.name,myJob.getThreadId())
  175. return true;
  176. }
  177. var runningThread:uint = threadLocal.getValue(disO.name) as uint ;
  178. if(runningThread == myJob.getThreadId()){
  179. return true;
  180. }
  181. return false;
  182. }
  183. /**
  184. * ????
  185. * @retrun ?????????
  186. */
  187. private function fadeProcess(disO:DisplayObject,tR:Number,tG:Number,tB:Number):Boolean{
  188. // logger.info("Run~~~~~~~~~~~~~~~~~~~~~~" + myThread);
  189. var curCT:ColorTransform = disO.transform.colorTransform;
  190. var curR:Number = curCT.redOffset;
  191. var curG:Number = curCT.greenOffset;
  192. var curB:Number = curCT.blueOffset;
  193. var nR:Number = changeColorProcess(curR,tR);
  194. var nCT:ColorTransform = disO.transform.colorTransform;
  195. if(COMPARE_SAME != nR){
  196. nCT.redOffset = nR
  197. }
  198. var nG:Number = changeColorProcess(curG,tG);
  199. if(COMPARE_SAME != nG){
  200. nCT.greenOffset= nG
  201. }
  202. var nB:Number = changeColorProcess(curB,tB);
  203. if(COMPARE_SAME != nB){
  204. nCT.blueOffset = nB
  205. }
  206. disO.transform.colorTransform = nCT;
  207. nCT = null;//let gc go its work
  208. if(COMPARE_SAME == nR && COMPARE_SAME == nG && COMPARE_SAME ==nB){
  209. // logger.info("Clear: ~~~~~~~~~~~~~~~~~~" + myThread)
  210. return true;
  211. }
  212. return false;
  213. }
  214. /**
  215. * ??????????color??????null?????????????color
  216. */
  217. private function initColor(shadowEles:Array):void
  218. {
  219. for each(var disO:DisplayObject in shadowEles){
  220. var colorInfo:ColorTransform = disO.transform.colorTransform;
  221. if(0 == colorInfo.color){
  222. colorInfo.color = 0x999999;
  223. disO.transform.colorTransform = colorInfo;
  224. }
  225. }
  226. }
  227. private function changeColorProcess(curCol:Number,toCol:Number):Number{
  228. if(curCol == toCol){
  229. return COMPARE_SAME;
  230. }
  231. else if(curCol > toCol){
  232. return curCol - 1;
  233. }
  234. else if(curCol < toCol){
  235. return curCol + 1;
  236. }
  237. return COMPARE_SAME;
  238. }
  239. }
  240. }