老孟导读:没有接触过音乐字幕方面知识的话,会对字幕的实现比较迷茫,什么时候转到下一句?看了这篇文章,你就会明白字幕太容易了。
先来一张效果图:
## 字幕格式
目前市面上有很多种字幕格式,比如SSA SRT,
屁股(文本形式)和idx sub(图形格式),但不管哪一种格式都会包含2个属性:时间戳和字幕内容,格式如下:
00:00 歌词:00:25 我要穿越这片沙漠00:28 找寻真的自我00:30 身边只有一匹骆驼陪我00:34 这片风儿吹过00:36 那片云儿飘过
上面字幕的意思是:在25秒的时候跳转到下一句,在28秒的时候跳转到下一句.
## 字幕实现
了解了字幕文件的形式,字幕实现起来就比较简单了,使用列表滚动视图控件,然后通过滚动控制器在合适的时机进行滚动,使当前字幕始终保持在屏幕中间。
解析字幕文件,获取字幕数据:
loadData()异步{ var jsonStr=wait defaultassetbundle。(上下文)的.loadStrIng(' assets/subtitle。txt’);var list=jsonstr。split(RegExp(' \ n ');名单。foreach((f){ if(f . is notempty){ var r=f . split(RegExp('));if(r . length=2){ _字幕列表。add(字幕条目(r[0],r[1]);} } });setState((){ });}
设置字幕控件及背景图片:
@ override widget build(构建上下文上下文){ return Scaffold(AppBar : AppBar(title : Text('弹幕),),体: Stack(子体:[已贴。填充(子图像:资产('资产/imgs/背景。' png ',fit: BoxFit.cover,),已发布。填充(子字幕:(_字幕列表),选择textstyle 3: TextStyle(颜色:颜色。白色,fontSize: 18),取消选择textstyle : TextStyle(颜色。黑色}
字幕控件的构建:
@ override widget build(构建上下文上下文){ if(widget。data==null | | widget。数据。长度==0){返回Container();}返回listrowscrollview。usedelegate(控制器: _ controller,直径比:小部件。直径比,项目扩展:小部件。item extend,child delegate : list wheelchildbuilderdelegate(builder :(上下文,索引){ 0返回容器(对齐:对齐。居中,子:文本($ { widget。数据[索引]).content} ',style: _ currentIndex==index?小部件。selectedtextstyle :小部件。取消选择extstyle,);},子计数:小部件。数据。长度),);}
字幕控件封装了选中字体和未选中字体样式参数,用法如下:
副标题(_副标题列表,选择文本样式:文本样式(颜色:颜色。白色,字体大小: 18),选择文本样式:文本样式(颜色:颜色。黑色。带有不透明度(.6),)
效果如下:
设置圆筒直径和主轴渲染窗口的尺寸的比,默认值是2,越小表示圆筒越圆
副标题(_副标题列表,直径勘误表:5)
下面是一和5的对比:
开源代码库地址:https://github。com/781238222/flutter-
做/树/主/扑_副标题_示例
## 交流
开源代码库地址:https://github。com/781238222/flutter-do
170 组件详细用法:http://laomengit.com
如果你对摆动还有疑问或者技术方面的疑惑,欢迎加入摆动交流群(微信:laomengit)。
同时也欢迎关注我的摆动公众号【老孟程序员】,公众号首发摆动的相关内容。
Flutter生态建设离不开你我他,需要大家共同的努力,点赞也是其中的一种,如果文章帮助到了你,希望点个赞。