package ckaction.style { import flash.display.Sprite; import ckaction.act.loadXml; import ckaction.act.script; public class track { private var THIS: Sprite = null; private var CFIG: Object = {}; private var trackList: Array = []; private var trackIndex: int = 0; private var trackDelay:Number=0; private var nowTrackShow: Object = { sn: "" }; private var trackElement: Array = []; private var time: Number = 0; private var isClose: Boolean = false; public function track(sp: Sprite, config: Object, file: String = "",trackD:Number=0) { if (!file) { return; } THIS = sp; CFIG = config; trackDelay=trackD; new loadXml(file, function (data: String) { if (isClose) { return; } else { if (data) { //trace(data); trackList = parseSrtSubtitles(data); //script.traceObject(trackList); } } }); // constructor code } public function changeSize(n:int=0,m:int=0):void{ CFIG["size"]=n; CFIG["leading"]=m; trackHide(); trackShow(nowTrackShow); } public function sendTime(t: Number): void { if (isClose) { return; } time = t; if (trackIndex >= trackList.length) { trackIndex = 0; } var nowTrack: Object = trackList[trackIndex]; //当前编号对应的字幕内容 if(nowTrack==null){ return; } /* this.nowTrackShow=当前显示在界面上的内容 如果当前时间正好在nowTrack时间内,则需要判断 */ //trace(t,trackIndex,nowTrack["startTime"],nowTrack["endTime"]); if (t >= nowTrack["startTime"] && t <= nowTrack["endTime"]) { /* 如果当前显示的内容不等于当前需要显示的内容时,则需要显示正确的内容 */ var nowShow = nowTrackShow; if (nowShow["sn"] != nowTrack["sn"]) { trackHide(); trackShow(nowTrack); } } else { /* * 如果当前播放时间不在当前编号字幕内,则需要先清空当前的字幕内容,再显示新的字幕内容 */ //trace("重新计算编号"); trackHide(); checkTrack(); } } //========================================== private function trackShow(track: Object) { if (isClose) { return; } nowTrackShow = track; var arr: Array = track["content"]; for (var i: int = 0; i < arr.length; i++) { var tObj:Object=CFIG; tObj["type"]="text"; tObj["text"]=arr[i]; /*var tObj:Object={ type: "text", text: arr[i], color: CFIG["color"], size: CFIG["size"], font: CFIG["font"], leading: CFIG["leading"], bold: CFIG["bold"], alpha: 1 };*/ //if(CFIG.hasOwnProperty("backgroundColor")){ // tObj["backgroundColor"]=CFIG["backgroundColor"]; //} var obj: Object = { list: [tObj], position: [1, 2, null, -(arr.length - i) * CFIG["leading"] - CFIG["marginBottom"]] }; var ele: String = THIS["addElement"](obj); trackElement.push(ele); } } /* 内部函数 隐藏字字幕内容 */ private function trackHide() { for (var i: int = 0; i < trackElement.length; i++) { THIS["deleteElement"](trackElement[i]); } trackElement = []; } /* 内部函数 重新计算字幕的编号 */ private function checkTrack() { if (isClose) { return; } var num: int = trackIndex; var arr: Array = trackList; var i = 0; var have = false; for (i = num; i < arr.length; i++) { if (time >= arr[i]["startTime"] && time <= arr[i]["endTime"]) { trackIndex = i; //trace("新的编号:",time,trackIndex); have = true; break; } } if (!have) { trackIndex = 0; } } //================================= private function delHtmlTag(str: String) { return str.replace(/<[^>]+>/g, ""); //去掉所有的html标记 } private function trim(str: String) { return str.replace(/(^\s*)|(\s*$)/g, ""); } private function toSeconds(t: String) { //将时分秒转换成秒 var s: int = 0.0; if (t) { var p: Array = t.split(":"); for (var i: int = 0; i < p.length; i++) { s = s * 60 + parseFloat(p[i].replace(",", ".")); } } return s; } private function parseSrtSubtitles(srt: String) { var subtitles: Array = []; var textSubtitles: Array = []; var i: int = 0; var arrs: Array = srt.split("\n"); var arr: Array = []; for (i = 0; i < arrs.length; i++) { if (arrs[i].replace(/\s/g, "").length > 0) { arr.push(arrs[i]); } else { if (arr.length > 0) { textSubtitles.push(arr); } arr = []; } } for (i = 0; i < textSubtitles.length; ++i) { var textSubtitle: Array = textSubtitles[i]; if (textSubtitle.length >= 2) { var sn: int = textSubtitle[0]; // 字幕的序号 var startTime: Number = toSeconds(trim(textSubtitle[1].split(" --> ")[0])); // 字幕的开始时间 var endTime: Number = toSeconds(trim(textSubtitle[1].split(" --> ")[1])); // 字幕的结束时间 var content: Array = [delHtmlTag(textSubtitle[2])]; // 字幕的内容 if(trackDelay!=0){ startTime+=trackDelay; endTime+=trackDelay; } // 字幕可能有多行 if (textSubtitle.length > 2) { for (var j = 3; j < textSubtitle.length; j++) { content.push(delHtmlTag(textSubtitle[j])); } } // 字幕对象 var subtitle: Object = { sn: sn, startTime: startTime, endTime: endTime, content: content }; subtitles.push(subtitle); } } return subtitles; } public function close(): void { trackHide(); isClose=true; } } }