Flutter 实现网易云音乐字幕的代码
没有接触过音乐字幕方面知识的话,会对字幕的实现比较迷茫,什么时候转到下一句?看了这篇文章,你就会明白字幕so easy。
先来一张效果图:
字幕格式
目前市面上有很多种字幕格式,比如srt, ssa, ass(文本形式)和idx+sub(图形格式),但不管哪一种格式都会包含2个属性:时间戳和字幕内容,格式如下:
00:00 歌词: 00:25 我要穿越这片沙漠 00:28 找寻真的自我 00:30 身边只有一匹骆驼陪我 00:34 这片风儿吹过 00:36 那片云儿飘过
上面字幕的意思是:在25秒的时候跳转到下一句,在28秒的时候跳转到下一句…
字幕实现
了解了字幕文件的形式,字幕实现起来就比较简单了,使用ListWheelScrollView
控件,然后通过ScrollController
在合适的时机进行滚动,使当前字幕始终保持在屏幕中间。
解析字幕文件,获取字幕数据:
loadData() async {
var jsonStr =
await DefaultAssetBundle.of(context).loadString('assets/subtitle.txt');
var list = jsonStr.split(RegExp('n'));
list.forEach((f) {
if (f.isNotEmpty) {
var r = f.split(RegExp(' '));
if (r.length = 2) {
_subtitleList.add(SubtitleEntry(r[0], r[1]));
}
}
});
setState(() {});
}
设置字幕控件及背景图片:
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('弹幕'),
),
body: Stack(
children: <Widget [
Positioned.fill(
child: Image.asset(
'assets/imgs/background.png',
fit: BoxFit.cover,
)),
Positioned.fill(
child: Subtitle(
_subtitleList,
selectedTextStyle: TextStyle(color: Colors.white,fontSize: 18),
unSelectedTextStyle: TextStyle(
color: Colors.black.withOpacity(.6),
),
diameterRatio: 5,
itemExtent: 45,
))
],
),
);
}
字幕控件的构建:
@override
Widget build(BuildContext context) {
if (widget.data == null || widget.data.length == 0) {
return Container();
}
return ListWheelScrollView.useDelegate(
controller: _controller,
diameterRatio: widget.diameterRatio,
itemExtent: widget.itemExtent,
childDelegate: ListWheelChildBuilderDelegate(
builder: (context, index) {
return Container(
alignment: Alignment.center,
child: Text(
'${widget.data[index].content}',
style: _currentIndex == index
? widget.selectedTextStyle
: widget.unSelectedTextStyle,
),
);
},
childCount: widget.data.length),
);
}
字幕控件封装了选中字体和未选中字体样式参数,用法如下:
Subtitle(
_subtitleList,
selectedTextStyle: TextStyle(color: Colors.white,fontSize: 18),
unSelectedTextStyle: TextStyle(
color: Colors.black.withOpacity(.6),
)
)
效果如下:
设置圆筒直径和主轴渲染窗口的尺寸的比,默认值是2,越小表示圆筒越圆
Subtitle(
_subtitleList,
diameterRatio: 5,
)
下面是1和5的对比:
Github地址:https://github.com/781238222/flutter-do/tree/master/flutter_subtitle_example
交流
Github地址:https://github.com/781238222/flutter-do
170+组件详细用法:http://laomengit.com
总结
到此这篇关于Flutter 实现网易云音乐字幕的文章就介绍到这了,更多相关Flutter 实现网易云音乐字幕内容请搜索ZaLou.Cn以前的文章或继续浏览下面的相关文章希望大家以后多多支持ZaLou.Cn!
- md5算法原理一窥(其一)
- 实现属于自己的TensorFlow(一) - 计算图与前向传播
- 基于Sanic的微服务基础架构
- hdu 3038 How Many Answers Are Wrong ( 带 权 并 查 集 )
- Java 基础知识点(必知必会其二)
- Java 基础知识点(必知必会其一)
- PyQt5 GUI应用程序工具包入门(3)—信号槽
- web基础之hibernate(一篇)
- 微信小程序头脑王者辅助神器
- web基础之Structs(一篇)
- S3上传代码用例-golang
- jsp-------------之分页技术(一)
- ------------数据库的加锁操作(上)
- 对象存储基础概念
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 团体程序设计天梯赛-练习集 L1-015 跟奥巴马一起画方块
- 团体程序设计天梯赛-练习集 L1-011 A-B
- vuepress引入vue-qr组件后build报错navigator is not defined问题
- 团体程序设计天梯赛-练习集 L1-022 奇偶分家
- k8s——针对有状态服务实现数据持久化
- 团体程序设计天梯赛-练习集 L1-017 到底有多二
- 团体程序设计天梯赛-练习集 L1-032 Left-pad
- ansible运行报错CryptographyDeprecationWarning解决
- 团体程序设计天梯赛-练习集 L1-018 大笨钟
- 天啦噜,项目上使用InputStream,我被坑了一把!
- 团体程序设计天梯赛-练习集 L1-019 谁先倒
- 团体程序设计天梯赛-练习集 L1-034 点赞
- 团体程序设计天梯赛-练习集 L1-028 判断素数
- 团体程序设计天梯赛-练习集 L1-039 古风排版
- 团体程序设计天梯赛-练习集 L1-027 出租