最近打算仿网易云音乐的音乐播放器,除了网络框架、接口数据、界面效果等这些因素外,最核心的就是音乐的播放和歌词的显示。
考虑到歌词显示控件涉及到歌词解析,自定义控件的实现等等诸多方面,可能文章的篇幅上会比较冗长,同时也为了方便自己和码友们能够根据自己的需求和爱好各取所需,将《歌词显示控件的实现上》这篇文章分成上、下两篇,分别是《歌词显示控件的实现上——歌词解析》和《歌词显示控件的实现下——歌词展示自定义View》。而今天将要分享的是上篇,主要讲解关于*.lrc文件的解析。
我们本文的目的是将lrc格式的歌词文件进行解析,并能将其展示到界面。
先看下效果:
ok,开始切入正题
01
—
了解歌词文件结构
写过音乐播放器的朋友可能都了解过歌词文件的规范格式,既然是歌词显示的控件,就必然需要清楚地了解歌词文件的组成规范,才能准确无误的解析歌词文件,得到我们想要的信息。
那我们先看一个最普通的歌词文件:
所有歌词文件——*.lrc文件 都是以一个标准来进行制作的(如上)。
从上述内容可以得出:
对比json和xml结构的数据,歌词这样的数据结构更加简单和清晰。
了解清楚歌词文件结构,我们就能对症下药:
02
—
开始解析
既然了解了歌词文件的组成部分,那么解析歌词文件也就不难,就是简单的文件内容读取:
就能获得文件内容了,在这里有一点需要注意的是,各种流在使用结束后一定要调用close()方法关闭。
下面就是实现歌词文件的解析工作:
1、实体类
首先,需要准备两个类主要用于歌词解析结果的缓存:
LineInfo:歌词行信息:包含行开始时间和歌词行内容 LyricInfo:歌词信息:包含标题、歌手、专辑等等
2、解析工具类
首先因为在实体类中,包括以后自定义View时的时间都是以毫秒为单位的long类型,所以我们需要一方法将时间标签中的内容转为long类型的毫秒值:
然后就是逐行解析:
我们需要对各种标签进行判断和解析,然后赋值给实体类对象。
首先拿到"]"字符的索引,然后截取对应标签的内容进行匹配,分别进行赋值。
特别的想说一句:解析歌词时,可能会遇到某行有时间但没有歌词内容,就做了这样一个处理:if(line.length()==10) lineInfo.setContent("");
3、从输入流中读取,并调用步骤2中方法逐行解析
因为歌词文件不论在assets下还是在SD卡上,我们必须都得获取输入流,设置编码格式,然后调用analyzeLyricByLine逐行解析,将解析完的数据设置给新建的实体类并返回。
这里我们核心使用的是BufferedReader 的 readLine()方法。
03
—
解析验证
这里为了方便,我将歌词文件放在了assets下
这里就很简单了,不再累赘,注意一下使用StringBuilder拼接每行的歌词内容,每次拼接完成后加换行,才能出现我们想要的结果。
再看下效果:
下一篇,关于展示歌词的自定义View的文章,我会抓紧时间发布,敬请期待!