中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Flutter如何實現文本滾動高亮效果

發布時間:2022-03-18 16:07:40 來源:億速云 閱讀:179 作者:iii 欄目:開發技術

這篇文章主要介紹“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如何實現文本滾動高亮效果

關于“Flutter如何實現文本滾動高亮效果”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永寿县| 南和县| 马尔康县| 沧源| 夏河县| 桐庐县| 鄯善县| 全州县| 太仓市| 无棣县| 扶绥县| 五原县| 沂南县| 定安县| 保定市| 昆山市| 武宁县| 宁化县| 太和县| 阳谷县| 无锡市| 嫩江县| 怀远县| 南平市| 马边| 肃南| 城步| 浪卡子县| 渝北区| 大安市| 台南县| 平昌县| 青冈县| 乌鲁木齐市| 苗栗县| 临桂县| 偃师市| 湘潭市| 绵阳市| 涞水县| 无锡市|