原文:C# WPF 歌词控件(支持逐字定位描色效果)

之前做了一个模仿网易云歌词的控件,实现了加载网易云歌词并能随音乐播放进度定位歌词。今天呢将在这个控件的基础上增加逐字定位描色功能,如下图效果(QQ音乐PC)所示:

我所使用的实现方法很简单粗暴,把每句歌词每个字切开,单独显示在一个描色的控件中,然后拼成一行完整的歌词,随音乐播放进度去找相应的字进行描色。

而最重要的描色功能是怎么实现的呢?

答案是:使用ClipToBounds属性

当控件ClipToBounds属性为TRUE时,超出控件范围的内容将会被裁剪掉不显示。现在你应该能明白描色功能怎么实现了吧?

在一个自定义控件中有两个Label,设置一个为置顶(ZINDEX最大)显示并加上颜色,给顶部的这个Label设置ClipToBounds属性为TRUE,然后默认顶部的Label宽度为0,描色的过程就把顶部的Label宽度慢慢增加。

最终完成的效果如下图,为了更直观地看到效果我给两个Label都加上了不同的背景颜色:

当然描色时间我没调好。当进度到达某个字时就调用那个字的控件执行一个宽度动画,动画目标就是置顶的Label,动画时间就是唱这个字所花费的时间。

这里就不把项目所有代码贴出来了,因为都是些简单的调用和判断而已,只贴描色的部分代码。

歌词负责描色的控件如下,每个字都单独显示在这个控件中

<Grid Background="Yellow">
<!--描色层-->
<Canvas Background="Black" HorizontalAlignment="Left" ClipToBounds="True" Name="ColorLayer" Panel.ZIndex="1">
<Label Name="ColorWordLabel" Foreground="Red">测</Label>
</Canvas>
<Label Name="WordLabel" >测</Label>
</Grid>
double tovalue = WordLabel.ActualWidth;
widthAnimation.From = ;
widthAnimation.To = tovalue;
widthAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(Time));
ColorLayer.BeginAnimation(WidthProperty, widthAnimation);

后台代码的描色其实就是播放一个动画,动画操作了带有颜色的字体控件宽度,也就是ColorLayer控件,宽度从From 0开始到 To WordLabel的实际宽度,播放所需时间Duration是Time(毫秒单位),就这几句代码完成了描色的过程。

完整项目下载:

点击下载

要知道普通的LRC格式歌词是没有记录每个字的吟唱时间的,而QQ音乐、酷狗音乐的歌词文件都经过不同算法的加密保护,没法直接读取,所以在这个项目中我将自己创建一个歌词格式。

那么歌词文件必须要包含以下信息:

1,完整歌词;

2,每句歌词的开始时间;

3,每句歌词每个字的吟唱耗时;

为了方便读写将使用JSON的数据格式来保存。

计划:

  1. 制作一个简单的描色歌词制作工具(参考酷狗音乐的歌词制作工具),在读取普通的LRC歌词后能可视化地去编辑每个字的吟唱时间,生成项目专用的歌词文件; []
  2. 单独分离成一个控件; [√]
  3. 性能优化; [×]

------------------------------------------------------------------------------------------------------

经过不断地缝缝补补和复制粘贴,已经完成了计划中的1、2。(2018年4月28日

首先说第1项,歌词制作工具,在播放音乐的同时调整描色的进度,将吟唱时间记录到歌词数据中,导出控件专用的NRC歌词数据格式方便调用。制作描色的时候决定了歌词描色的准确与否,而且还必须得比较熟悉歌曲才能制作出完美的描色歌词,这点有待改进。

所有歌词都调整描色完毕之后点击导出NRC文件即可完成制作,如果在没有将所有字描色完成之前导出会导致歌词显示控件无法正常描色定位。操作方式跟酷狗的歌词制作工具差不多,按键盘上键切到上一个字,下键切到下一个字。酷狗歌词制作工具制作的描色歌词好像会进行后期计算调整,更加准确,以后会想办法实现。

歌词制作工具的调用步骤是:

1,载入歌词(可以是网易云的或者是NRC的)

2,设置音乐的路径

然后启动工具点击play就可以开始制作了(最好是一遍过,反复调整的话很麻烦)

最后是我用制作工具制作的NRC歌词播放效果演示:

歌词显示已经单独分离成一个控件了,调用方法如下:

1,加载歌词:

控件.LoadNRC(歌词字符串);//歌词字符串可以是网易云的也可以是NRC的

2,在播放音乐开始时实时调用此方法更新歌词:

控件.UpdatePositionTime(播放进度总毫秒);

3,调整音乐进度后要调用此方法重新定位歌词:

控件.ResetPositionTime(播放进度总毫秒);

4,暂停音乐时调用此方法(同时不要再UpdatePositionTime):

控件.Pause();

控件源码、调用示例源码、歌词制作工具源码请通过Github获取:

https://github.com/NaiveNET/NaiveRC

C# WPF 歌词控件(支持逐字定位描色效果)的更多相关文章

  1. WPF ItemsControl 控件支持鼠标滚轮滑动

    此文章意在解决在WPF中ItemsControl类型的集合控件支持鼠标滚轮操作,并可控制滚动的速度. 第一步:给ItemsControl添加滚轮事件. this.listBox.AddHandler( ...

  2. C# WPF 低仿网易云音乐(PC)歌词控件

    原文:C# WPF 低仿网易云音乐(PC)歌词控件 提醒:本篇博客记录了修改的过程,废话比较多,需要项目源码和看演示效果的直接拉到文章最底部~ 网易云音乐获取歌词的api地址 http://music ...

  3. Qt实现表格控件-支持多级列表头、多级行表头、单元格合并、字体设置等

    目录 一.概述 二.效果展示 三.定制表头 1.重写数据源 2.重写QHeaderView 四.设置属性 五.相关文章 原文链接:Qt实现表格控件-支持多级列表头.多级行表头.单元格合并.字体设置等 ...

  4. WPF界面开发者注意啦!Scheduler控件支持时区功能了,你get了吗

    DevExpress广泛应用于ECM企业内容管理. 成本管控.进程监督.生产调度,在企业/政务信息化管理中占据一席重要之地.通过DevExpress WPF Controls,您能创建有着强大互动功能 ...

  5. 一款开源免费的WPF图表控件ModernuiCharts

    一款简洁好看的Chart控件  支持WPF.silverlight.Windows8  ,基本够用,主要是开源免费的.(商业控件ComponentOne for WPF要4w多呢) This proj ...

  6. WPF布局控件常用属性介绍

    WPF布局控件常用属性介绍 其它 | 作者:慧都控件网 | 2011-04-06 13:41:57| 阅读 0次 有用(0) 评论(0)   概述:WPF布局控件都是派生自System.Windows ...

  7. WPF第三方控件盘点

    WPF统一的编程模型.语言和框架,实现了界面设计人员和开发人员工作可以分离的境界,鉴于WPF强大的优势,且一直是开发者关注的地方,下面和大家分享基于WPF项目开发需要用到的第三方控件,包括业界最受好评 ...

  8. QRowTable表格控件-支持hover整行、checked整行、指定列排序等

    目录 一.开心一刻 二.嘴一嘴 三.效果展示 四.浅谈实现 五.自定义数据源 1.data函数 2.flags函数 六.自定义视图 1.目的 2.问题分析 七.测试 八.相关文章 原文链接:QRowT ...

  9. WPF滑块控件(Slider)的自定义样式

    前言 每次开发滑块控件的样式都要花很久去读样式代码,感觉有点记不牢,所以特此备忘. 自定义滑块样式 首先创建项目,添加Slider控件. 然后获取Slider的Window样式,如下图操作. 然后弹出 ...

随机推荐

  1. 谁要的手机用KRKR2 Onscripter 资源打包工具

    本软件能够把你手机上指定文件夹打包为文字冒险游戏资源文件 支持打包 1.Onscripter 的NSA格式 2.吉里吉里2(KRKR2)的XP3.(分2.29曾经的旧版本号和2.30以后新版本号) 3 ...

  2. 《SPA设计与架构》之MV*框架

    原文 简书原文:https://www.jianshu.com/p/39f8f0aefdc2 大纲 1.认识MV*框架 2.传统UI设计模式 3.对框架的本质认识——框架有效性和框架分类 4.MV*基 ...

  3. Xamarin Android 绑定 UVCCamera

    这段时间工作上需要在Android设备上读取视频.摄像头用的是奥比中光的3D摄像头.我手上的摄像头的彩色通道使用的的UVC协议的. 在Xamarin上可用的UVC的封装基本上没有,只有一个小伙在Xam ...

  4. ios开发之图层与核心动画一:图层CALayer的认识

    #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutl ...

  5. Android 在ListView中嵌套ListView的事件处理

    前天在工作中遇到在ListView中的Item需要用ListView来展现处理后的内容,然后就遇到了一个很头疼的问题,作为Item的ListView没法进行滑动,而且显示也不正常,只是显示几个子Ite ...

  6. js导出报表

    原文链接:https://blog.csdn.net/qq_37936542/article/details/78376156 需求:项目中有一个学生签到模块需要导出每天的签到数据,一开始用poi在后 ...

  7. 用Ajax图片上传、预览、修改图片

    首选图片的上传和下载并不是很难,但要注意细节. 一,给出前端图片上传的html代码 1.图片上传的控件 <img src="/${res}/images/default.png&quo ...

  8. ORACLE会话数、连接数配置

    ORACLE会话数.连接数配置 ORACLE会话数.连接数配置 ORACLE的会话数和连接数参数配置 以sysdba身份登录 sqlplus sys/xxxx as sysdba; 查看最大连接数: ...

  9. WeakRefence

    http://183615215-qq-com.iteye.com/blog/1867568

  10. [Angular] Router outlet events

    For example, we have a component which just simply render router-outlet: import { Component } from ' ...