当我们制作音乐播放器中我觉得歌词的处理是比较难的一块, 对于音乐播放和媒体控制我们可以使用MediaPlayer来搞定,它提供了媒体控制的接口,使得我们对于媒体控制来说变得比较简单。但对于显示歌词来说就比较复杂了一点,例如让歌词一个字一个字高亮、快进时控制歌词处理或者倍速播放时歌词的处理等等, 这里我想介绍简单让一行歌词高亮显示, 等这行歌词唱完,让下一行歌词高亮显示。
1. 解析歌词文件
常见的歌词文件有:.lrc 和 .txt格式, 内容格式为:[00:02.59] 飘洋过海来看你
所以我们先要去解析歌词文件, 定义一个类去保存每行解析出来的数据。
public class Lyric {
public String lricString;
public int sleepTime;
public int timePoint;
}
我们对照着 "[00:02.59] 飘洋过海来看你" 来看, lrcString保存的是"飘洋过海来看你", sleepTime保存的是这句歌词播放时间, 就是下一句歌词开始播的时间减去本句歌词播放的时间,timePoint就是将 “[00:02.59]” 时间文本解析出来转换成的秒数。
现在我们开始解析歌词文件然后将数据保存到Lyrc中
public class LrcUtils {
private static List<Lyric> lyricList;
/**
* 读取文件
*/
public static List<Lyric> readLRC(File f) {
try {
if (f == null || !f.exists()) {
lyricList = null;
} else {
lyricList = new Vector<Lyric>();
InputStream is = new BufferedInputStream(new FileInputStream(f));
BufferedReader br = new BufferedReader(new InputStreamReader(
is, getCharset(f)));
String strTemp = "";
while ((strTemp = br.readLine()) != null) {
strTemp = <span style="font-family:Arial, Helvetica, sans-serif;font-size:10px;">processLRC</span>(strTemp);
}
br.close();
is.close();
// 对歌词进行排序
Collections.sort(lyricList, new Sort());
// 计算每行歌词的停留时间
for (int i = 0; i < lyricList.size(); i++) {
Lyrc one = lyricList.get(i);
if (i + 1 < lyricList.size()) {
Lyric two = lyricList.get(i + 1);
one.sleepTime = two.timePoint - one.timePoint;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return lyricList;
}
/**
* 处理一行内容
*/
private static String processLRC(String text) {
try {
int pos1 = text.indexOf("[");
int pos2 = text.indexOf("]");
if (pos1 >= 0 && pos2 != -1) {
Long time[] = new Long[getPossiblyTagCount(te