WEB开发网
开发学院手机开发Android 开发 Android 实现歌词同步 阅读

Android 实现歌词同步

 2010-09-10 01:05:00 来源:WEB开发网   
核心提示:歌词同步的原理其实很简单:歌词显示是一个线程, 音乐播放时一个线程,通过播放时间将歌词显示进度与播放进度同步起来,Android 实现歌词同步,网络标准的歌词格式是LRC. 我们看下一个LRC文档,其格式就一目了然了.[ti:爱][ar:小虎队][al:华纳国语情浓13首][by:爱上你了音乐网][02:08.00][

歌词同步的原理其实很简单:

歌词显示是一个线程, 音乐播放时一个线程,通过播放时间将歌词显示进度与播放进度同步起来。

网络标准的歌词格式是LRC. 我们看下一个LRC文档,其格式就一目了然了.

[ti:爱]

[ar:小虎队]

[al:华纳国语情浓13首]

[by:爱上你了音乐网]

[02:08.00][00:38.00]把你的心、我的心串一串

[02:11.00][00:41.00]串一株幸运草、串一?同心圆

[02:16.00][00:46.00]让所有期待未?的呼唤

[02:19.00][00:49.00]趁青春做?伴

[03:16.00][02:24.00][00:53.00]?让年轻越长大越孤单

[03:19.00][02:27.00][00:56.00]把我的幸运草种在你的梦田

[03:23.00][02:31.00][01:01.00]让地球随我?的同心圆

….

LRC 格式为 [歌词显示起始时间][歌词显示结束时间]歌词内容。

了解歌词同步原理,我们可以想到要做如下工作:

1. LRC 解析

2. LRC 歌词显示

3. 歌词与播放音乐同步

4. 歌词的获取

一 LRC解析

这边我推荐YOYOPlayer 音乐播放开源项目. 源代码已经非常好的支持了LRC解析. 我拿过来就用了.

过程大概如此: 把LRC文件读到内存里面,用 sentence数据结构存放. Sentence里面有 Fromtime, Totime, content三个成员变量。显示的时候需要这些数据。

二. LRC歌词显示

歌词的绘制通过重写 OnDraw方法.

绘制的代码贴出来:

long t = tempTime;

int index = getNowSentenceIndex(t);

if (index == -1) {

return;

}

Sentence now = list.get(index);

float f = (t - now.getFromTime()) * 1.0f

/ (now.getToTime() - now.getFromTime());

if (f > 0.98f) {

f = 0.98f;

}

Shader shader = new LinearGradient(0, 0,

now.getContentWidth(mTxtPaint), 0, new int[] { Color.RED,

Color.BLUE }, new float[] { f, f + 0.01f },

TileMode.CLAMP);

mTxtPaint.setShader(shader);

canvas.drawText(now.getContent(), 0, 20, mTxtPaint);

1 2  下一页

Tags:Android 实现 歌词

编辑录入:coldstar [复制链接] [打 印]
赞助商链接