前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >歌词显示控件的实现(上)——歌词解析

歌词显示控件的实现(上)——歌词解析

作者头像
蜻蜓队长
发布2018-08-03 14:40:38
2.1K0
发布2018-08-03 14:40:38
举报
文章被收录于专栏:Android机动车

最近打算仿网易云音乐的音乐播放器,除了网络框架、接口数据、界面效果等这些因素外,最核心的就是音乐的播放和歌词的显示。

考虑到歌词显示控件涉及到歌词解析,自定义控件的实现等等诸多方面,可能文章的篇幅上会比较冗长,同时也为了方便自己和码友们能够根据自己的需求和爱好各取所需,将《歌词显示控件的实现上》这篇文章分成上、下两篇,分别是《歌词显示控件的实现上——歌词解析》和《歌词显示控件的实现下——歌词展示自定义View》。而今天将要分享的是上篇,主要讲解关于*.lrc文件的解析。

我们本文的目的是将lrc格式的歌词文件进行解析,并能将其展示到界面。

先看下效果:

ok,开始切入正题

01

了解歌词文件结构

写过音乐播放器的朋友可能都了解过歌词文件的规范格式,既然是歌词显示的控件,就必然需要清楚地了解歌词文件的组成规范,才能准确无误的解析歌词文件,得到我们想要的信息。

那我们先看一个最普通的歌词文件:

所有歌词文件——*.lrc文件 都是以一个标准来进行制作的(如上)。

从上述内容可以得出:

  • 所有标签(包括时间标签)全部由“[”和“]”两个符合标识,其对应各自内容
  • 一行只表达一条信息
  • "ti"表示标题、"ar"表示歌手、"al"表示专辑、"by"表示制作、"offset:"表示时间偏移量
  • "[mm:ss.ms]"表示歌词时间和内容

对比json和xml结构的数据,歌词这样的数据结构更加简单和清晰。

了解清楚歌词文件结构,我们就能对症下药:

02

开始解析

既然了解了歌词文件的组成部分,那么解析歌词文件也就不难,就是简单的文件内容读取:

  • 1、首先获取*.lrc歌词文件的二进制流InputStream,
  • 2、再又转换成字符流
  • 3、然后再调用BufferedReader的readLine()方法逐行读取文件内容

就能获得文件内容了,在这里有一点需要注意的是,各种流在使用结束后一定要调用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的文章,我会抓紧时间发布,敬请期待!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-11-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android机动车 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档