在网上查了一下资料,感谢 http://www.cr173.com/html/20184_1.html 给了我思路,可以说他提供了最基本的歌词同步的功能,我在其上面添加了自己的修改的代码。
主要是自己为了实现歌词同步,并且通过移动seekbar,改变歌曲的歌词位置。当然还有自己不一样的地方。
首先歌词播放,是要一个子线程来操作,这个子线程负责在找到两段歌词之间的时间差,然后显示当前正在播放的歌词。
1
歌词部分
1.歌词的格式为.lrc 这是有一定格式的,最重要的是[MM:ss,mm]
以白玫瑰.lrc歌词为例
需要对歌词进行解析,歌词的实体类。
MyLrc.java
public class MyLrc implements Comparable<Object>{
private int time;
private String lyric;
public int getTime() {
return time;
}
public void setTime(int time) {
this.time = time;
}
public String getLyric() {
return lyric;
}
public void setLyric(String lyric) {
this.lyric = lyric;
}
//放在set集合中可以看下面要求进行排序
@Override
public int compareTo(Object arg0) {
int later=0;
if(arg0 instanceof MyLrc)
{
later=((MyLrc)arg0).getTime();
}
return this.time-later;
}
@Override
public String toString() {
return this.time+""+this.lyric;
}
}
实现comparaTo的方法的目的是在把对象放入TreeSet中的时候,按照歌词时间的循序放入,方便之后拿出来。比较使用(我觉得这部很重要,因为后期需要判断拉动SeekBar的时候找到对应的时间的位置)
LrcUtil.java
//对歌词进行解析
public class LrcUtil {
private static TreeSet<MyLrc> tree;
// 将对应的lrc文件转化为treeMap,分别对应的时间以及歌词
public LrcUtil(InputStream musicTitle) {
TreeSet<MyLrc> treeset = new TreeSet<MyLrc>();
// 用来存放歌曲的时间和对应的歌词
InputStreamReader inReader = null;
BufferedReader reader = null;
try {
inReader = new InputStreamReader(musicTitle);
reader = new BufferedReader(inReader);
String line = "";
while ((line = reader.readLine()) != null) {
// 对那行歌词进行分割,判断,然后存储
String[] substr = line.split("\\]");
for (String ss : subs