时间:2021-05-20
没有接触过音乐字幕方面知识的话,会对字幕的实现比较迷茫,什么时候转到下一句?看了这篇文章,你就会明白字幕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(() {});}设置字幕控件及背景图片:
@overrideWidget 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, )) ], ), );}字幕控件的构建:
@overrideWidget 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 实现网易云音乐字幕内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
网易云音乐版本为7.2.24,ios版本为13.6.1,手机为iphone11,ios网易云音乐云盘打开的方法如下: 网易云音乐是由网易公司于2013年4月2
网易云音乐版本为7.2.24,ios版本为13.6.1,手机为iphone11,ios网易云音乐云盘打开的方法如下: 1、在手机上打开网易云音乐。 2、在主
网易云音乐注销账号方法如下: 1、首先需要知道网易云音乐账号只支持在pc端上注销,进去网易云官网进行注销; 2、进去网易云音乐官网之后,登录账号,点击个人设
以网易云音乐7.3.25为例,网易云音乐突然暂停的原因如下: 1、网易云音乐在后台停止播放并且通知栏播放条也消失 这是由于系统关闭了云音乐服务。现在很多手机
以网易云音乐为例,网易云有电视版本,网易云音乐tv版apk包是一款专为智能电视机用户开发的音乐盒子,在网易云音乐tv版apk包中你可以收听到很多好听的音乐。