原作品是06世界杯临近期间英文雅虎页面上的阿迪达斯倒计时牌冠名广告。设计富有金属质感,属于我比较喜欢的风格。反编译以后发现代码比较乱,然后手就有点痒,再然后就有了下面的代码。
首先是CountDown的类,其中handler是Function类型的公有变量,该函数将用于处理怎么显示倒计时代码。
class CountDown {
private var finalTime:Date;
private var currentTime:Date;
private var timeDiff:Number;
public var handler:Function = null;
public function CountDown(date:Date) {
this.finalTime = date != null ? date : new Date(1900, 0, 0, 0, 0, 0);
}
private function init():Void {
this.currentTime = new Date();
this.timeDiff = finalTime.getTime() - currentTime.getTime();
if (this.timeDiff < 0)
this.timeDiff = 0;
}
public function run():Void {
init();
var _day:Number = Math.floor(timeDiff/(1000*60*60*24));
var _hour:Number = Math.floor((timeDiff/(1000*60*60))%24);
var _minute:Number = Math.floor((timeDiff/(1000*60))%60);
var _second:Number = Math.floor((timeDiff/1000)%60);
show(_day,_hour,_minute,_second);
}
private function show(day:Number, hour:Number, minute:Number, second:Number):Void {
if(handler != null)
handler(day,hour,minute,second);
}
}
在倒计时影片剪辑中加入以下代码,其中1和2两个位置的判断很重要。
var cd = new CountDown(new Date(2012, 8, 22, 0, 0, 0));
var oldDigitString = "000000000";
function doStart(day,hour,minute,second){
doShow(digitFix(day,4)+digitFix(hour,2)+digitFix(minute,2)+digitFix(second,2));
}
function doShow(digitString){
if(oldDigitString == digitString) return;//1.
for(var i = 0; i < digitString.length; i++){
if(oldDigitString.charAt(i) != digitString.charAt(i))//2.
doDisplay(eval('d_'+i),oldDigitString.charAt(i),digitString.charAt(i));
}
oldDigitString = digitString;
}
function doDisplay(o,oldNum,newNum){
o._prev = oldNum;
o._next = newNum;
o.gotoAndPlay(2);
}
function digitFix(num,len):String{
while(num.toString().length < len)
num = '0'+num;
return num.toString();
}
cd.handler = doStart;
this.onEnterFrame = function()
{
cd.run();
}
剽窃后的成果-_-!
其中这里的终点时间是我30岁的生日,到倒计时牌都是0000000000的时候,不知道我会不会哭泣……