在播放音檔時,論文區域能夠跟著字幕的時間標記出目前所講的位置,完全是依賴廣論/字幕對應表所描述的內容來完成。廣論/字幕對應表的檔案是BookMap.java,其中mapStr這個字串陣列總共有320個字串,對應到320個音檔內容,字串內的元素是分號(;)來分隔每一筆記錄,每一筆記錄又以6個數字所組成,每一個數字所代表的意義如下所表示:
音檔序號, 字幕的序號, 頁數, 行數, 字數, 長度
每一筆記錄中要對應音檔的播放時間與廣論的位置,簡而言之,前面兩個數字是對應到音檔的時間,後面四個數字是對應到廣論的內容。廣論App會每隔一段時間檢查目前播放的時間並找出該對應的字幕序號,再把字幕內容顯示在字幕區(請參閱字幕檔案規則),為了減少計算量,第二個參數所對應到的是字幕的序號,也就是說當前面的計算找到字幕的序號時,同時也找到了論文該反白的位置。
建構該資料結構的程式如下(擷取自LamrimReaderActivity.java):
bookMap = new int[se.length][]; for (int i = 0; i < mediaBookMaps.length; i++) { int index = mediaBookMaps[i][1]; if (index >= se.length) { bookMap[index] = new int[4]; bookMap[index][0] = mediaBookMaps[i][BookMap.PAGE]; bookMap[index][1] = mediaBookMaps[i][BookMap.LINE]; bookMap[index][2] = mediaBookMaps[i][BookMap.WORD]; bookMap[index][3] = mediaBookMaps[i][BookMap.LENGTH]; } } for (int i = 1; i < bookMap.length; i++) if (bookMap[i] == null) bookMap[i]=bookMap[i-1]; bookMap是存放上述的對應表的陣列,為了讓程式可以快速的對應找到要反白的位置,將bookMap建構成與字幕陣列一樣長度(se.length),先在對應表中填入每一筆記錄(第一個for迴圈),接著再將中間未填資料的部份填入該位置之前的最後一筆記錄,依序填滿以後就完成我們所需要的資料結構,執行時便可以照著前面的描述快速的找到對應的資料。
|