no commit message

This commit is contained in:
niandeng
2020-09-17 18:40:01 +08:00
parent 4382915d09
commit d957abceaa
283 changed files with 86935 additions and 63 deletions
+220
View File
@@ -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;
}
}
}