no commit message
This commit is contained in:
@@ -0,0 +1,220 @@
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user