一、lrc歌詞檔案的解析
先要了解lrc檔案的格式,可以參考:總體思路是這樣的,按行讀入歌詞文字,忽略每行中的注釋,即「[:]」後的內容;再解析標識標籤(id-tags);最後解析出時間標籤及其對應的歌詞語句。具體實現如下:
1、忽略注釋
private string removecomment(string line)
return str;
}
2、解析標識標籤
private void getlyricidtags(string line)
else if (type.equals("ar"))
else if (type.equals("al"))
else if (type.equals("by"))
} }
3、解析時間標籤
這裡我用了map結構來儲存歌詞開始時間及歌詞語句的配對關係,value為歌詞語句,key值為該歌詞開始時間。這裡用了乙個正規表示式來匹配時間標籤,支援[ : ] 、[ : : ] 、[ : . ]三種格式的時間標籤。gettimeofline()函式的作用是將時間標籤轉換成以毫秒為單位的時間量。
private void getlyrictimetags(string line)
:\\d([\\.:]\\d)?\\]").matcher(line);
listtime = new arraylist();
int begindex = 0;
while (m.find())
for (int i : time)
}
二、歌詞語句分行
lrc檔案中的單句歌詞可能過長,在android螢幕的給定區域中未必能單行顯示,從而需要依據螢幕歌詞顯示區域的寬度進行斷句分行。其中尋找分割點的實現如下:
private int getdividepoint(string str, int begindex, int endindex)
} return endindex;
}
分割過程如下,其中tp為android中textpaint型別的物件,textpaint用於在view中繪製文字,它提供了乙個測定文字寬度的函式measuretext():
int begindex = 0;
for (int i = 0; i <= line.length(); ++i)
if (i == line.length())新增分行結果的最後一部分
lines.add(line.substring(begindex, i));
}
三、歌詞的同步顯示
「敵動我不動 你動我不動」這句開始高亮顯示 「敵動我不動 你動我不動」結束高亮顯示
其中,caloffsetofcurrentline()函式為:
private float caloffsetofcurrentline()
public boolean ontouchevent(motionevent event)
return true;
}
Android 歌詞同步
歌詞同步的原理其實很簡單 歌詞顯示是乙個執行緒 網路標準的歌詞格式是 lrc.我們看下乙個 lrc文件,其格式就一目了然了.ti 愛 ar 小虎隊 al 華納國語情濃13首 by 愛上你了 網 02 08.00 00 38.00 把你的心 我的心串一串 02 11.00 00 41.00 串一株幸運...
Android 實現歌詞同步
歌詞的繪製通過重寫 ondraw方法.繪製的 貼出來 long t temptime int index getnowsentenceindex t if index 1 sentence now list.get index float f t now.getfromtime 1.0f now.g...
Android 實現歌詞同步
歌詞同步的原理其實很簡單 網路標準的歌詞格式是lrc.我們看下乙個lrc文件,其格式就一目了然了.ti 愛 ar 小虎隊 al 華納國語情濃13首 by 愛上你了 網 02 08.00 00 38.00 把你的心 我的心串一串 02 11.00 00 41.00 串一株幸運草 串一?同心圓 02 1...