220 lines
5.5 KiB
ActionScript
220 lines
5.5 KiB
ActionScript
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;
|
|
}
|
|
|
|
}
|
|
|
|
} |