您好,登錄后才能下訂單哦!
這篇文章主要介紹“Flutter如何實現文本滾動高亮效果”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Flutter如何實現文本滾動高亮效果”文章能幫助大家解決問題。
因為在Text
中會存在兩段文本, 所以就不能單只用Text
組件, 而改用Text.rich
. 通過textSpan
生成一個數組然后放到text.rich
中. 所以本文需要處理, 而不是自己一個個拼接, 所以需要先有一個解析的類來負責處理.
需要在項目中加入第三方插件 string_scanner
用于掃描文本.
class StringParser { // 導入的文本 final String content; // 高亮部分尾部索引, 也就是兩段的區分位置 final int endIndex; StringParser({required this.content, required this.endIndex}); late StringScanner _scanner; // 解析函數 InlineSpan parser() { _scanner = StringScanner(content); parseContent(); final List<InlineSpan> spans = []; int currentPosition = 0; // 需要高亮的部分 spans.add(TextSpan(style: _spans.style, text: _spans.text(content))); currentPosition = _spans.end; // 未高亮的部分 if (currentPosition != content.length) { spans.add( TextSpan(text: content.substring(currentPosition, content.length))); } return TextSpan(style: TextStyleSupport.defaultStyle, children: spans); } late SpanBean _spans; // 解析需要變成高亮的字符 void parseContent() { int startIndex = 0; _spans = SpanBean(startIndex, endIndex); if (!_scanner.isDone) { _scanner.position++; } } }
之后需要定義一個高亮的數據類型, 用于方便修改之后想要高亮的文本樣式和默認樣式.
class SpanBean { SpanBean(this.start, this.end); final int start; final int end; String text(String src) { return src.substring(start, end); } TextStyle get style => TextStyleSupport.highLightStyle; } class TextStyleSupport { static const defaultStyle = TextStyle(color: Colors.black, fontSize: 36); static const highLightStyle = TextStyle(color: Colors.green, fontSize: 36); }
至此文本高亮和非高亮處理完成, 只需要在文件中導入后使用.
滾動效果則需要實現一個play
函數里通過 Future.delayed
來控制延時遞歸執行.
_starPlay(flag) { // flag用于判斷是 執行還是暫停 if (this.endIndex == content.length + 1 || !flag) { return; } parser = StringParser(content: content, endIndex: this.endIndex++); span = parser.parser(); setState(() {}); Future.delayed(Duration(milliseconds: 100)).then((value) { _starPlay(this.flag); }); }
最終在文件里的代碼則是
import 'package:flutter/material.dart'; import 'string_parser.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', home: MyHomePage(), ); } } class MyHomePage extends StatefulWidget { MyHomePage({Key? key}) : super(key: key); @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { late InlineSpan span; final String content = """一點不錯,”狐貍說。“對我來說,你還只是一個小男孩,就像其他千萬個小男孩一樣。我不需要你。你也同樣用不著我。對你來說,我也不過是一只狐貍,和其他千萬只狐貍一樣。但是,如果你馴服了我,我們就互相不可缺少了。對我來說,你就是世界上唯一的了;我對你來說,也是世界上唯一的了。"""; late StringParser parser; int endIndex = 0; bool flag = true; @override void initState() { super.initState(); parser = StringParser(content: content, endIndex: endIndex); span = parser.parser(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("滾動高亮文本"), actions: [ ElevatedButton( onPressed: () { this.flag = true; _starPlay(flag); print('開始'); }, child: Text("開始")), ElevatedButton( onPressed: () { this.flag = false; // _starPlay(flag); print('暫停'); }, child: Text("暫停")) ], ), body: Padding( padding: const EdgeInsets.all(20.0), child: Text.rich(span), )); } _starPlay(flag) { if (this.endIndex == content.length + 1 || !flag) { return; } parser = StringParser(content: content, endIndex: this.endIndex++); span = parser.parser(); setState(() {}); Future.delayed(Duration(milliseconds: 100)).then((value) { _starPlay(this.flag); }); } }
實現效果:
關于“Flutter如何實現文本滾動高亮效果”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。