当前位置:   article > 正文

Flutter跑马灯Marquee_flutter marquee

flutter marquee

android原生得自带跑马灯,可真是幸福啊!Flutter就没那么友好了,必须自己去写,写写也好(安慰自己),了解下怎么实现的;原理其实很简单,代码量也很少。只不过是让ListView不停的animateTo就行了;本跑马灯不但可以水平方向滚动,也可以垂直方向滚动,好了,看下效果图

老规矩,先看下我写好的控件是怎么使用的!

第一步:添加以下代码到你的pubspec.yaml文件

  1. dependencies:
  2. marquee_flutter: ^0.1.2

第二步:导包,添加以下代码到你要使用的文件下

import 'package:marquee_flutter/marquee_flutter.dart';

第三步:写你的业务代码(下面是我写的示例代码)

  1. class MarqueeWidgetDemo extends StatelessWidget{
  2. @override
  3. Widget build(BuildContext context) {
  4. return new Scaffold(
  5. appBar: new AppBar(
  6. title: new Text("跑马灯"),
  7. ),
  8. body:new MarqueeWidget(
  9. text: "ListView即滚动列表控件,能将子控件组成可滚动的列表。当你需要排列的子控件超出容器大小",
  10. textStyle: new TextStyle(fontSize: 16.0),
  11. scrollAxis: Axis.vertical,
  12. )
  13. );
  14. }
  15. }

OK,到这里跑马灯已经可以运行了,不过还是要说下控件中每个参数的作用,以便小伙伴更好的发挥

text跑马灯要显示的文字
textStyke文字的样式
scrollAxis显示的方向,即横向显示或竖向显示
width宽度
height高度
ratioOfBlankToScreen跑马灯前 后文字间空白部分相对屏幕的宽度

是不是用起来很简单,代码实现也很简单的;首先,我们既然要animateTo,肯定是要Controller来动画,还有我们要在第一帧完成后启动timer来保证它不停的animateTo,还有控件尺寸的初始化我们统一在initState里面来做

  1. @override
  2. void initState() {
  3. super.initState();
  4. scroController=new ScrollController();
  5. _containerWidth=new Text(widget.text,style: widget.textStyle).style.fontSize;
  6. _widgetWidth=widget.width!=null&&widget.width>_containerWidth?widget.width:_containerWidth;
  7. _widgetHeight=widget.height==null?null: widget.height;
  8. WidgetsBinding.instance.addPostFrameCallback((callback){
  9. startTimer();
  10. });
  11. }

初始化完成了,看下build方法,我上面说过,我用的ListView设计的,listView是怎么做到不停的循环的呢?我给ListView设计了3个child,这3个child都是差不多的(中间的child给前后加了间距);当我滚完第二个child的时候,我就又回到(jumpTo)第一个child的开始位置继续滚动,这样的 视觉欺骗 成就了循环往复,就有了跑马灯的效果

  1. @override
  2. Widget build(BuildContext context) {
  3. return new Container(
  4. width: _widgetWidth,
  5. height: _widgetHeight,
  6. child: new Center(
  7. child: new ListView(
  8. scrollDirection: widget.scrollAxis,
  9. controller: scroController,
  10. physics: new NeverScrollableScrollPhysics(),
  11. children: <Widget>[
  12. getBothEndsChild(),
  13. getCenterChild(),
  14. getBothEndsChild(),
  15. ],
  16. ),
  17. ),
  18. );
  19. }
  20. Widget getBothEndsChild(){
  21. if(widget.scrollAxis ==Axis.vertical){
  22. String newString=widget.text.split("").join("\n");
  23. return new Text(newString,style: widget.textStyle,textAlign: TextAlign.center,);
  24. }
  25. return new Text(widget.text,style: widget.textStyle,);
  26. }
  27. Widget getCenterChild(){
  28. if(widget.scrollAxis ==Axis.horizontal){
  29. return new Container(width: screenWidth*widget.ratioOfBlankToScreen);
  30. }else{
  31. return new Container(height: screenHeight*widget.ratioOfBlankToScreen);
  32. }
  33. }

下面是child循环往复的代码

  1. void startTimer(){
  2. timer=Timer.periodic(new Duration(milliseconds: _timerRest), (timer){
  3. double maxScrollExtent=scroController.position.maxScrollExtent;
  4. double pixels=scroController.position.pixels;
  5. if(pixels+_moveDistance>=maxScrollExtent){
  6. position=(maxScrollExtent-screenWidth/4+screenWidth)/2-screenWidth+pixels-maxScrollExtent;
  7. scroController.jumpTo(position);
  8. }
  9. position+=_moveDistance;
  10. scroController.animateTo(position,duration: new Duration(milliseconds: _animationDuration),curve: Curves.linear);
  11. });
  12. }

代码是不是又点猥琐,不过只要实现功能就行了,我测试了,性能还蛮好的,大家可以放心使用哈,

最后一点重要事,在页面销毁的时候要注销Timer,注销Timer,注销Timer

  1. @override
  2. void dispose() {
  3. super.dispose();
  4. timer.cancel();
  5. }

如果在使用的过程中有什么问题,请留言,随时为你解答,

最后附上源码地址:https://github.com/OpenFlutter/PullToRefresh

里面有很多更酷的控件,欢迎Star;如果喜欢Flutter,可以加入我们哦,我们的QQ群是 :892398530

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/383212
推荐阅读
相关标签
  

闽ICP备14008679号