歌词同步的原理其实很简单:
  歌词显示是一个线程, 音乐播放时一个线程,通过播放时间将歌词显示进度与播放进度同步起来。
  网络标准的歌词格式是LRC 我们看下一个LRC文档,其格式就一目了然了。
  [ti:爱]
  [ar:小虎队]
  [al:华纳国语情浓13]
  [by:爱上你了音乐网]
  [0208.00][0038.00]把你的心、我的心串一串
  [0211.00][0041.00]串一株幸运草、串一?同心圆
  [0216.00][0046.00]让所有期待未?的呼唤
  [0219.00][0049.00]趁青春做?伴
  [0316.00][0224.00][0053.00]?让年轻越长大越孤单
  [0319.00][0227.00][0056.00]把我的幸运草种在你的梦田
  [0323.00][0231.00][0101.00]让地球随我?的同心圆
  LRC 格式为 [歌词显示起始时间][歌词显示结束时间]歌词内容。
  了解歌词同步原理,我们可以想到要做如下工作:
    1. LRC 解析
    2. LRC 歌词显示
    3. 歌词与播放音乐同步
    4. 歌词的获取
  LRC解析
  推荐YOYOPlayer 音乐播放开源项目。 代码已经非常好的支持了LRC解析。
  过程大概如此: LRC文件读到内存里面,用 sentence数据结构存放。 Sentence里面有 Fromtime Totime content三个成员变量。显示的时候需要这些数据。
 
  LRC歌词显示
  歌词的绘制通过重写 OnDraw方法。
  绘制的代码贴出来:
   
long t = tempTime
int index = getNowSentenceIndext);
if index == -1 {
return
}
Sentence now = listgetindex);
float f = t - nowgetFromTime()) * 1.0f/ ToTime() - FromTime());
if f > 0.98f {
f = 0.98f
}
Shader shader = new LinearGradient0 0nowgetContentWidthmTxtPaint), 0 new int[] { Color.RED金碧辉煌近义词Color.BLUE }new float[] { f f + 0.01f }TileMode.CLAMP);
mTxtPaint.setShadershader);
canvas.drawTextContent感恩妈妈的唯美句子(), 0 20 mTxtPaint山东杏林学院);
 
上面的代码很简单,关键一个函数是getNowSentenceIndext. 通过播放时间来获得歌词的索引. 我们看下getNowSentenceIndex()如何实现.  
java代码:
private int getNowSentenceIndexlong t {
for int i = 0 i < list.size(); i++ {
if i.isInTimet)) {
return i
}
}
// throw new RuntimeException"竟然出现了不到的情况!");
return -1
}
还有一个歌词渐变的效果,其关键代码在与对画笔的设置,如下.  
java代码:
Shader shader = new LinearGradient0 0
ContentWidthmTxtPaint), 0 new int[] { Color.RED海参怎么洗才干净Color.BLUE } new float[] { f f + 0.01f }TileMode.CLAMP);
mTxtPaint.setShadershader);
. 歌词与播放音乐同步  
音乐播放的时候,同时启动歌词显示线程. 将音乐播放的时间设置到歌词View的成员变量中, 以达到同步的目的.  
java代码:
private class MyHandler extends Handler {
@Override
public void handleMessageMessage msg {
// Log.v">>>##hahah", "" + mp.getCurrentPosition());
// 重画
lrcView.mLyric.setTimemp.getCurrentPosition());
lrcView.invalidate();
  }
}
不断学习. 歌词的获取   歌词的获取是通过百度搜索出来的. 具体代码如下,很好看懂,关键代码如下:  
GetMethod get = new GetMethod"http//www.baidu/s?wd=" + de"filetypelrc " + key "GBK"));
get.addRequestHeader"Host" "www.2cto");
get.addRequestHeader"User-Agent" "Mozilla/5.0 Windows U Windows NT 5.1 zh-CN rv1.8.1.11 Gecko/20071127 Firefox/2.0.0.11");
get.addRequestHeader"Accept" "text/xmlapplication/xmlapplication/xhtml+xmltext/htmlq=0.9text/plainq=0.8image/png*/*q=0.5");
get.addRequestHeader"Accept-Language"团购方案, "zh-cnzhq=0.5");
get.addRequestHeader"Keep-Alive" "300");
get.addRequestHeader"Referer" "http//www.baidu/");
get.addRequestHeader"Connection" "keep-alive");
int i = uteMethodget);