Android+Flutter实现文字跑马灯特效
作者:WeninerIo 发布时间:2022-11-24 05:57:58
跑马灯被运用在很多领域, 例如商场的电子条幅、大楼的宣传广告位、地铁的广告位.不过毫无疑问的是它们都是为了解决文字过长的问题而应景给出的一种解决方案.
今天我们来说一下flutter 怎么通过绘制来实现跑马灯效果! 等不及想看源码的兄弟们,请走这里:https://github.com/weniner/flutter_demo/blob/main/lib/text_effects/widget/marquee_effect.dart
分析实现
我们都知道跑马灯是不停的往前跑. 在给定的区域里,如果是最小的绘制区域,我们也至少绘制出它左边刚出头,右边刚出尾的所有子项.同时我们也需要一个东西来驱动它去前行.
同时,文字也会有很多情况.
它可能很短,也可能和给定的的区域相等,也可能远超我们给定的区域. 在这种情况下,我们应该首先获取文字的宽度.然后确定每秒它会移动多少.并且还需要一个驱动器来驱动它去做这些变化.
测量文字
如果大家写过Flutter, 一定用过Text Widget. 既然Text Widget 可以根据文字大小来展示,说明Flutter中是有一个api可以测量文字长宽的.这里直接给出答案:
// 我们最终绘制的文字
final String kText = 'Flutter 文字特效之跑马灯';
{
// 需要被测量的文字 Widget
TextSpan measureText =
TextSpan(text: kText, style: const TextStyle(color: Colors.black));
TextPainter _painter = TextPainter(
text: measureText,
textDirection: TextDirection.ltr,
// 这里定义最大为1行
maxLines: 1,
// 这里给定文字绘制的约束最小为0.0, 最大不限制.从而获取真实的文字宽高
)..layout(minWidth: 0.0, maxWidth: double.infinity);
}
其中,TextPainter便包含了我们需要的文字宽高.我们创建一个对象去保存这个信息,方便 后面去绘制.
// 这里继承里ChangeNotifier, 可以让我们以最小的代价刷新界面
class _TextInfo extends ChangeNotifier {
// 绘制时最前面的文字偏移
double head = 0.0;
double width;
double margin;
_TextInfo(this.width, this.margin);
// speed是我们定义的偏移速度,
// 这里与我们的偏移量息息相关
void update(double speed) {
// 首先先让偏移量自减
head -= speed;
// 如果超过了文字大小和间距的总长度,说明当前的文字已经超出了屏幕.
// 我们应该用紧接着下一条数据的偏移量赋值.
if (head < -width - margin) {
head += width + margin;
}
notifyListeners();
}
}
动画为媒
文字测量完后, 我们还需要一个可以驱动文字移动的驱动器. 这里你可以通过ticker自己实现一个驱动. 我们为了简单化考虑, 没错~ 我们又要请出我们的好兄弟AnimationController重出江湖了
实际上这里运用不了太多AnimationController的参数,我们唯一需要在乎的就是Duration, 也就是时间越短.我们将跑的越快.时间越长,跑的越慢.可以说是反比关系.
{
AnimationController _scrollController =
AnimationController(vsync: this, duration: const Duration(seconds:1));
}
最终绘制
万事俱备,只欠东风. 像一个方程, 我们所有的未知数都有了解. 只剩下最后求y了. 这里我们通过CustomPainter来绘制文字. 我们之前通过创建自己的类保存了文字信息,同时让它继承了ChangeNotifier就是为了今朝.
_RevolvingLanternPainter(
this.painter,
this.textInfo,
) : super(repaint: textInfo);
我们将CustomPainter的repaint参数赋值成我们自己定义的类. 每次我们update() 都会通知界面来刷新,从而不会影响别的界面, 只影响当前的绘制画布. 然后, 我们就可以去真正的绘制啦~ 这里我们唯一需要做的,就是给一个值x记录下所有文字的偏移量. 如果偏移量大于当前的界面. 说明它不在界面上, 也就不用绘制啦!
@override
void paint(Canvas canvas, Size size) {
double x = textInfo.head;
while (x < size.width) {
painter.paint(canvas, Offset(x, 0.0));
x += textInfo.width + textInfo.margin;
}
}
通过这种方法, 我们实现了跑马灯文字的绘制~~
源码:https://github.com/weniner/flutter_demo/blob/main/lib/text_effects/widget/marquee_effect.dart
来源:https://juejin.cn/post/7169502001162616868


猜你喜欢
- 在servlet中,转发和重定向是由request和response完成的。两者之间的区别请看我之前的文章。那么在springMVC中是如何
- 公钥与私钥公钥与私钥是成对的,一般的,我们认为的是公钥加密、私钥解密、私钥签名、公钥验证,有人说成私钥加密,公钥解密时不对的。公钥与私钥的生
- 本文以在chart控件上和窗体上画矩形为例子讲述了C# GDI在控件上绘图的方法。分享给大家供大家参考。具体方法如下:具体的实现方法就不多解
- Android中广播(BroadcastReceiver)的详细讲解.1. BroadcastReceiver的注册过程: (1).广播消息
- PUT和Delete请求使用在Form表单中,只支持get和post方式,而为了实现put方式我们可以通过如下三个步骤实现1)SpringM
- 一、电量统计模块概述耗电信息在设置 -> 电量中能够非常直观的看到。注意,Android 所有功耗统计都是通过代码估算,没有集成电路参
- 系统启动过程图: Framework层所有的Service都是运行在SystemServer进程中;SystemServer进程
- 在java 编程中,我们常常有这样的需求:需要将一段字符串内的特定字符串,按照一定规则查找出来或替换,比如匹配文本开头规则和结束规则。以下就
- Alert顾名思义一就是一个警告框,一般使用情况比如:退出登录,清楚缓存,提示修改密码等等。。。ReactNative中的Alert只有一个
- 本文实例为大家分享了android传送照片到FTP服务器的具体代码,供大家参考,具体内容如下在安卓环境下可以使用,在java环境下也可以使用
- centos下搭建GitLab+Jenkins持续集成环境,供大家参考,具体内容如下1、安装JDKyum install -y java2、
- 查看公司项目代码时,存在这样一个问题:winform界面上有很多信息填写,提交
- Random类介绍Random类一个用于产生 伪随机 数字的类。这里的伪随机表示有随机性但是可以基于算法模拟出随机规律。Random类的构造
- 这篇文章主要介绍了跨域解决方案Jsonp原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以
- 首先安装consul环境,参照之前的文章:https://www.jb51.net/article/141789.htm项目规划,2个服务端
- /// <summary> /// 将List转换成Da
- 一:父级pom.xml文件 resources目录下新建指定文件夹,存放Spring配置文件<profiles> &
- 本文实例为大家分享了java实现webservice方式的具体代码,供大家参考,具体内容如下经过测试 jdk1.6.10以下会出现bug 建
- 本文实例为大家分享了C#基于Socket的TCP通信实现聊天室的具体代码,供大家参考,具体内容如下一、Socket(套接字)通信概念套接字(
- 方法一(推荐):设置datetimepicker的属性ShowCheckBox为true在窗口初始化时候,添加代码this.datetime