大家好,我们是爱学啊,继上一篇讲解了【LRC歌词原理和实现高仿Android网易云音乐】,今天给大家带来一篇关于卡拉OK歌词原理和在Android上如何实现歌词逐字滚动的效果,本文来自【Android开发项目实战我的云音乐】课程。

效果图

相信大家都懂一张图胜过千言万语。

效果和现在市面上大部分播放器差不多,当然如果要运用到商业项目中,肯定还需要进行一些优化,例如:滚动效果有弹性,字体大小,字体颜色等。

什么是卡拉OK歌词

要明白什么是卡拉OK歌词,就先要搞明白什么是卡拉OK,简单来讲就是卡拉OK是一种伴奏系统,演唱者可以在预先录制的音乐伴奏下参与唱歌,现多叫KTV(Karaoke);卡拉OK歌词默认格式为ksc,当然现在市面上的一些软件在他的基础上做了定制,具体的在我们的课程中讲解了;我们这里就讲解ksc,因为卡拉OK歌词的核心就是精确到每一个字,所以搞明白他的原理,我们也就可以在他的基础上定制了。

LRC歌词格式

在实现歌词功能前,肯定需要搞明白ksc歌词格式,例如:我们找了一段LRC歌词:

karaoke := CreateKaraokeObject;
karaoke.rows := 2;
karaoke.TimeAfterAnimate := 2000;
karaoke.TimeBeforeAnimate := 4000;
karaoke.clear;
karaoke.add('00:20.699', '00:27.055', '[●●●●●●]', '7356',RGB(255,0,0));karaoke.add('00:27.487', '00:32.068', '一时失志不免怨叹', '347,373,1077,320,344,386,638,1096');
karaoke.add('00:33.221', '00:38.068', '一时落魄不免胆寒', '282,362,1118,296,317,395,718,1359');
karaoke.add('00:38.914', '00:42.164', '那通失去希望', '290,373,348,403,689,1147');
karaoke.add('00:42.485', '00:44.530', '每日醉茫茫', '298,346,366,352,683');
karaoke.add('00:45.273', '00:49.029', '无魂有体亲像稻草人', '317,364,380,351,326,351,356,389,922');
karaoke.add('00:50.281', '00:55.585', '人生可比是海上的波浪', '628,1081,376,326,406,371,375,1045,378,318');
karaoke.add('00:56.007', '01:00.934', '有时起有时落', '303,362,1416,658,750,1438');
karaoke.add('01:02.020', '01:04.581', '好运歹运', '360,1081,360,760');
karaoke.add('01:05.283', '01:09.453', '总嘛要照起来行', '303,338,354,373,710,706,1386');
karaoke.add('01:10.979', '01:13.029', '三分天注定', '304,365,353,338,690');
karaoke.add('01:13.790', '01:15.950', '七分靠打拼', '356,337,338,421,708');
karaoke.add('01:16.339', '01:20.870', '爱拼才会赢', '325,1407,709,660,1430');

可以看到内容是用换行符分割的,如果这些数据是通过接口返回,而不是直接返回一个文件,那么这里面的换行符应该变为\n换行符,这一点我们也在课程中讲解到了。

每一行是一句歌词;每一行歌词又分为四部分:

第一部分:这一行开始时间
第二部分:这一行结束时间
第三部分:这一句歌词
第四部分:每个字持续的毫秒

其中顶部的一些信息是元数据:不同的播放器可能实现不一样。

查看上面的歌词,我们可以发现有大部分的重复内容,所以可以定制。

歌词滚动原理

将每行歌词前面的时间解析后,转为毫秒,这样播放器在播放的时候可以获取到播放时间,然后拿着时间查找当前时间对应哪一行歌词,然后在查看当前时间对应该行的哪一个字,然后进行相应的绘制,具体的在可以有讲解。

歌词解析

歌词解析就很简单了,就是字符串拆分,所以就不贴代码了;但希望大家在写代码的时候不要只局限于功能,也要注重架构;歌词有很多种,所以可以搞成用不同的类来解析,对外暴露统一的接口;这部分在课程中有讲解。

歌词绘制

不同的平台也不一样,我们这里是Android,所以绘制用Canvas。我们这里的思路是:歌词View的高度是固定的,由于我们希望当前行歌词始终显示到歌词View中间,所以先算出View的中心高度,然后在该位置绘制当前行歌词,这一步根据不同的歌词处理的逻辑也不一样,但歌词可分为两类,一类是逐行,一类是逐字,对于逐行来说就直接绘制就行了,只是颜色,大小不一样而已;逐字下一节讲解;然后从当前行歌词位置像前绘制歌词,直到超出View顶部为止,在从当前行歌词向下歌词绘制,直到超出View底部为止;当前你可以使用LinearLayout添加所有歌词当前容器内,然后滚动。

相对于LRC歌词,只需要添加ksc格式格式时绘制:

if (lyric.isAccurate()) {//精确到字歌词,格式可以有很多种//只是解析的时候不一样,但都组成成通用的model//所以在歌词View中,我们已经不需要知道是ksc,还是QQ歌词,还是酷狗歌词等。canvas.drawText(line.getLineLyrics(), x, y, backgroundTextPaint);if (lyricCurrentWordIndex == -1) {//该行已经播放完了lineLyricPlayedWidth = textWidth;} else {String[] lyricsWord = line.getLyricsWord();int[] wordDuration = line.getWordDuration();//获取当前时间前面的文字String beforeText = line.getLineLyrics().substring(0, lyricCurrentWordIndex);float beforeTextWidth = getTextWidth(foregroundTextPaint, beforeText);//当前字String currentWord = lyricsWord[lyricCurrentWordIndex];float currentWordTextWidth = getTextWidth(foregroundTextPaint, currentWord);//当前字已经演唱的宽度float currentWordWidth = currentWordTextWidth / wordDuration[lyricCurrentWordIndex] * wordPlayedTime;lineLyricPlayedWidth = beforeTextWidth + currentWordWidth;}canvas.save();//裁剪一个矩形用来绘制已经唱的歌词canvas.clipRect(x, y - textHeight, x + lineLyricPlayedWidth,y + textHeight);//这个矩形包是文字的高度+行高//canvas.drawRect(x, y - textHeight, x + lineLyricPlayedWidth,//        y + textHeight,foregroundTextPaint);canvas.drawText(line.getLineLyrics(), x, y, foregroundTextPaint);canvas.restore();
} else {//精确到行
}

歌词滚动

歌词和LRC是一样的。

到这里歌词View核心功能基本就实现完成了,如果要深入学习可以查看我们的【高仿Android网易云音乐】课程,或者在线电子书【电子书】。

转载于:https://www.cnblogs.com/ixuea/p/9821691.html

卡拉OK歌词原理和实现高仿Android网易云音乐相关推荐

  1. LRC歌词原理和实现高仿Android网易云音乐

    大家好,我们是爱学啊,今天给大家带来一篇关于LRC歌词原理和在Android上如何实现歌词逐行滚动的效果,本文来自[Android开发项目实战我的云音乐]课程:逐字滚动下一篇文章讲解. 效果图 相信大 ...

  2. 0.高仿Android网易云音乐OkHttp+Retrofit+RxJava+Glide+MVC+MVVM

    0.系列文章目录 1.启动界面 2.广告和引导界面 1.项目简介 这是一个使用Java(以后还会推出Kotlin版本)语言,从0开发一个Android平台,接近企业级的项目(我的云音乐),包含了基础内 ...

  3. android 网易云音乐上滑动画,Android 仿网易云音乐 音轨跳动效果

    网易云音乐的Loading效果,大家应该也比较熟悉了,效果是一个红色音轨不断跳动的效果,一般用于Loading等待时填充使用.本篇来自定义这个效果. Android 仿网易云音乐 音轨跳动View.g ...

  4. python爬歌词生成词云图_Python爬虫摇滚网易云音乐歌词生成词云图

    我相信经过前三篇文章,大家已经学会了怎么下载歌词和歌曲了.看了我的文章后开始行动起来的应该都享受到音乐的福利了.问一个问题,当你疲惫时,你想提起精神来去工作或者看书,你会选择听什么歌曲让自己兴奋起来呢 ...

  5. python soup歌词_【python】 爬取网易云音乐 专辑图片+歌词

    要求 下载一百首歌曲,相关图片以及相关文字信息 存储方式分别为: .mp3 .txt .png 比如第一首歌曲相关信息为001.mp3\001.txt\001.png 觉得像是小朋友的抄写作业有没有- ...

  6. 体验Vue3.0, 仿一个网易云音乐客户端

    一.用到的技术栈 前端: vue3.0全家桶:(ts+jsx) vuex: vuex-module-decorators swiper:非常受欢迎与实用的轮播图插件,swiper create-key ...

  7. 仿写网易云音乐Demo项目(Vue3+Vite+Vuex+Vue-Router4.0)

    前言 学习了一段时间vue3的基础知识学习,百学不如一练,想着还是做出一个实际的demo项目(适配为移动端),来实践巩固自己所学的知识点

  8. android+仿最新网易云音乐底面栏,安卓仿网易云音乐通知栏控制音乐,默认显示Notification bigView...

    最近在做一个音乐播放器的时候遇到了一个关于notification的问题,在网上找了很久都没有头绪.后来找到了解决的办法,特意记录一下. 问题描述 首先请看网易云音乐的通知栏 普通高度的notific ...

  9. 网易云音乐 歌词制作软件 BesLyric (最新版本下载)

    导读 BesLyric , 一款专门制作 网易云音乐 LRC 滚动歌词的软件! 搜索.下载.制作 歌词更方便! 哈哈,喜欢网易云音乐,又愁于制作歌词的童鞋有福啦!Beslyric 为你排忧解难! 本文 ...

最新文章

  1. 利用歌词插件 让WMP活起来
  2. javascript修改CSS
  3. xcode开发php,xcode怎么编写c语言
  4. JPA /休眠刷新策略初学者指南
  5. Qt学习笔记-简单的TCP程序
  6. fstab自动挂载_Linux系统挂载硬盘详解
  7. 盘点《令人心动的offer》中让人敲黑板的重点
  8. java两年需要,Java 两年总结
  9. 乒乓球单循环赛_乒乓球单循环赛积分表(比赛规则、对比表)
  10. 二、概率p值检验例题(R语言)
  11. 九宫格一共有多少种解法
  12. centos7 查看本地ip地址
  13. arm版红帽企业linux,红帽:ARM架构下的Linux不是玩笑
  14. 计算内容热度的算法解释
  15. 饮食控制和维生素干预下肠道菌群的变化
  16. miui11可用的位置模拟器_MIUI11内测体验包
  17. k8s 实战 - kubectl logs - 外传
  18. 【翻译】西川善司「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,前篇(1)...
  19. 408,你可敬的对手!
  20. SEO和UEO双结合才是网站优化的最高境界

热门文章

  1. iVMS-4200 Vs区别_理科与工科有什么区别?如何判断自己适合学那个?
  2. 老DOS游戏-殖民计划
  3. 锐捷睿易:acl的制定和应用
  4. Excel手机号如何查询实名认证?
  5. 悠悠岁月,匆匆2014
  6. 追加审批人样式html,更新 | 你的审批打印模板真丑!看别人用html模板怎么玩
  7. 上海浦东机场的wifi使用攻略
  8. 华为分析联运活动,助您提升游戏总体付费
  9. linux gtestgmock安装
  10. 迅雷 9 php,迅雷thunder://地址与普通url地址转换php