本发明涉及ios系统中歌曲字幕显示技术领域,具体说是一种歌词显示方法。
背景技术:
在ios系统中,音乐app能提供歌词动态滚动的效果,其中当前演唱的词句为高亮显示,参见图1,当前演唱的词句为“你的影子无情在身边徘徊”。
歌词常见的就是lrc歌词了,以图1为例,该歌词如下:
[ti:冰雨]
[ar:刘德华]
[al:笨小孩]
[00:0.05]冰雨
[00:0.94]作词:刘德华、李密作曲:潘协庆
[00:01.23]演唱:刘德华
[00:01.37]
[00:04.79](歌手独白)
[00:17.18]我是在等待一个女孩
[00:25.18]还是在等待沉沦苦海
[00:32.91]一个人静静发呆没有人去管花谢花开
[00:41.03]无法肯定的爱左右摇摆
[00:45.43]只好把心酸往深心里塞
[00:49.61]我是在等待你的回来
[00:57.73]难道只换回一句活该
[01:05.27]一个人静静发呆
[01:09.18]两个人却有不同无奈
[01:13.15]好好的一份爱啊怎么会慢慢变坏
[01:18.43]
[01:20.44]冷冷的冰雨在脸上胡乱的拍
[01:24.31]暖暖的眼泪跟寒雨混成一块
[01:28.32]眼前的色彩忽然被掩盖
[01:32.28]你的影子无情在身边徘徊
[01:36.30]你就像一个刽子手把我出卖
[01:40.35]我的心彷佛被剌刀狠狠地宰
[01:44.36]在悬崖上的爱谁会愿意接受最痛的意外
[01:51.09]
[02:26.59]我是在等待你的回来
[02:35.52]难道只换回一句活该
[02:42.99]一个人静静发呆
[02:46.99]两个人却有不同无奈
[02:51.08]好好的一份爱啊怎么会慢慢变坏
[02:56.42]
[02:58.54]冷冷的冰雨在脸上胡乱的拍
[03:02.41]暖暖的眼泪跟寒雨混成一块
[03:06.39]眼前的色彩忽然被掩盖
[03:10.31]你的影子无情在身边徘徊
[03:14.23]你就像一个刽子手把我出卖
[03:18.34]我的心彷佛被剌刀狠狠地宰
[03:22.33]在悬崖上的爱谁会愿意接受最痛的意外
[03:28.66]
[03:34.57]冷冷的冰雨在脸上胡乱的拍
[03:38.33]暖暖的眼泪跟寒雨混成一块
[03:42.31]眼前的色彩忽然被掩盖
[03:46.32]你的影子无情在身边徘徊
[03:50.27]你就像一个刽子手把我出卖
[03:54.34]我的心彷佛被剌刀狠狠地宰
[03:58.34]悬崖上的爱谁会敢去采
[04:02.37]还是愿意接受最痛的意外最爱的女孩
[04:08.85]
[04:19.72]悬崖上的爱谁会敢去采
[04:31.84]还是愿意接受最痛的意外最爱的女孩
[04:51.75]
[05:10.60]歌手独白
[06:16.76]
lrc文件中,每行为一句歌词,[]括号内为歌词对应的时间区间,显示时,通常将其解析分离为时间参数数组和歌词内容数组。
在实现滚动歌词效果时,之前采用定时器,每间隔多少毫秒来重绘整个画布的方式来实现高亮逐字歌词。其缺陷在于:占用资源多,系统开销大,动画效率不够理想。
技术实现要素:
针对现有技术中存在的缺陷,本发明的目的在于提供一种歌词显示方法,可逐字显示歌词并形成动画效果,通过keyframeanimation控制显示时间,动画效果流畅、美观,占用资源少,系统开销小,提高了运行效率。
为达到以上目的,本发明采取的技术方案是:
一种歌词显示方法,其特征在于,包括如下步骤:
步骤1,当需要显示歌词时,获取待显示歌词原文及显示相关信息;
所述显示相关信息,至少包括以下信息:
歌词的显示时间占比,具体包括:前置空白的显示时间占比,歌词中每一个字的显示时间占比;
步骤2,将底层的待显示歌词,采用直接绘制方式显示;
步骤3,对于上层的待显示歌词,计算每个字的显示速度:根据每一个字的显示时间占比,以及该字的字长,换算出显示该字所需的显示速度;
步骤4,对于上层的待显示歌词,采用部分渲染方式,将歌词中每一个字,从左至右依次显示;
且:部分渲染时,用keyframeanimation根据每个字的显示速度进行时间控制。
在上述技术方案的基础上,时间占比用百分比表示,
设某行歌词共有n个字,则:字1到字n的显示时间占比,加上该行歌词的前置空白的显示时间占比,等于100%。
在上述技术方案的基础上,时间占比的计算方式为:(字结束时间-字开始时间)/行总时间,所述行总时间为n个字的总显示时间。
在上述技术方案的基础上,遇到非中文字符或非中文字符串时,在该非中文字符或非中文字符串之后增加空格。
在上述技术方案的基础上,遇到非中文字符或非中文字符串时,在该非中文字符或非中文字符串之后增加空格,该空格设置占用时间为0.01秒。
在上述技术方案的基础上,遇到非中文字符或非中文字符串时,尝试进行乱码检测,确定非中文字符或非中文字符串是否需要转换为中文。
在上述技术方案的基础上,相邻两个字如果开始时间相同,则将后一个字延后0.1秒显示。
本发明所述的歌词显示方法,可逐字显示歌词并形成动画效果,通过keyframeanimation控制显示时间,动画效果流畅、美观,占用资源少,系统开销小,提高了运行效率。
附图说明
本发明有如下附图:
图1音乐app的歌词动态滚动的效果示意图。
图2歌词的显示时间占比示例。
图3本发明的流程图。
具体实施方式
以下结合附图对本发明作进一步详细说明。
如图3所示,本发明所述的歌词显示方法,包括如下步骤:
步骤1,当需要显示歌词时,获取待显示歌词原文及显示相关信息;
所述显示相关信息,至少包括以下信息:
歌词的显示时间占比,具体包括:前置空白的显示时间占比,歌词中每一个字的显示时间占比,参见图2所示,
时间占比用百分比表示,
设某行歌词共有n个字,则:字1到字n的显示时间占比,加上该行歌词的前置空白的显示时间占比,等于100%;
时间占比的计算方式为:(字结束时间-字开始时间)/行总时间,所述行总时间为n个字的总显示时间;
下面的步骤中,将待显示歌词至少分成两层(例如:可称为顶层和底层)进行显示,两层歌词内容相同;
步骤2,将底层的待显示歌词,采用直接绘制方式显示;
步骤3,对于上层的待显示歌词,计算每个字的显示速度:根据每一个字的显示时间占比,以及该字的字长,换算出显示该字所需的显示速度;
步骤4,对于上层的待显示歌词,采用部分渲染方式,将歌词中每一个字,从左至右依次显示;
且:部分渲染时,用keyframeanimation根据每个字的显示速度进行时间控制;
例如:利用layer的mask属性进行部分渲染;
mask虽然是个layer,但它并不会显示出来,它是用自己的alpha值来控制原layer内容渲染与否的一个layer:如果mask的alpha值为1,那原layer就会渲染出来,反之,就不会渲染出来,也就不会显示出来,而是透明的;
而且因为mask是个layer,可以给mask添加caanimation,所以就可以用mask的动画来让原layer从左到右逐渐显示;
keyframe是一个时间/值对,通过它可以定义一个在特定时间的特定状态,即关键帧,而且在两个keyframe之间可以定义不同的interpolator,就好像多个动画的拼接,第一个动画的结束点是第二个动画的开始点。
在上述技术方案的基础上,遇到非中文字符或非中文字符串时,在该非中文字符或非中文字符串之后增加空格。
在上述技术方案的基础上,遇到非中文字符或非中文字符串时,在该非中文字符或非中文字符串之后增加空格,该空格设置占用时间为0.01秒。
在上述技术方案的基础上,遇到非中文字符或非中文字符串时,尝试进行乱码检测,确定非中文字符或非中文字符串是否需要转换为中文。
在上述技术方案的基础上,相邻两个字如果开始时间相同,则将后一个字延后0.1秒显示。
本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。