android歌詞同步

2021-08-27 12:46:50 字數 2208 閱讀 5193

一、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...