当前位置: 首页 > article >正文

长文本溢出,中间位置显示省略号

1.说明

Flutter支持在文本末尾显示溢出省略号。现在想要实现在文本中间位置显示省略号,这里使用的方法是通过TextPainter计算文本宽度。(我目前没有找到更好的方法,欢迎大家指教。)

2.效果

在这里插入图片描述

源码

1.MiddleEllipsisTextPainter

class MiddleEllipsisTextPainter extends CustomPainter {
  final String text;
  final TextStyle textStyle;
  final double maxWidth;

  MiddleEllipsisTextPainter({
    required this.text,
    required this.textStyle,
    required this.maxWidth,
  });

  
  void paint(Canvas canvas, Size size) {
    TextPainter textPainter = TextPainter(
        textDirection: TextDirection.ltr,
        text: TextSpan(text: text, style: textStyle),
        maxLines: 1)
      ..layout(maxWidth: double.infinity);
    // print("textPainter.width = ${textPainter.width}");

    if (textPainter.width <= maxWidth) {
      print("📢 文本长度没有超过 maxWidth , 直接绘制");
      textPainter.paint(canvas, Offset.zero);
    } else {
      print("📢 😔 文本长度超过了 maxWidth , 在中间添加省略号");
      // 如果直接选取中间的位置展示省略号,那么很有可能后半段文案没有完整展示。
      // 替换方案:后半段限制最多的字符

      int lastMaxLength = 8;
      int splitPos = min(text.length - lastMaxLength, lastMaxLength).abs();

      String firstPart = text.substring(0, splitPos);
      String lastPart = text.substring(text.length - splitPos);
      String middlePart = '...';

      // 尾部
      TextPainter lastPainter = TextPainter(
          textDirection: TextDirection.ltr,
          text: TextSpan(text: lastPart, style: textStyle),
          maxLines: 1)
        ..layout(maxWidth: maxWidth);

      // 省略号
      TextPainter middlePainter = TextPainter(
          textDirection: TextDirection.ltr,
          text: TextSpan(text: middlePart, style: textStyle),
          maxLines: 1)
        ..layout(maxWidth: maxWidth);

      // 前半截
      TextPainter firstPainter = TextPainter(
          textDirection: TextDirection.ltr,
          textAlign: TextAlign.end,
          text: TextSpan(text: firstPart, style: textStyle),
          maxLines: 1)
        ..layout(maxWidth: maxWidth - middlePainter.width - lastPainter.width);

      // 从最左边开始绘制
      double startX = 0;
      firstPainter.paint(canvas, Offset(startX, 0));
      middlePainter.paint(canvas, Offset(startX + firstPainter.width, 0));
      lastPainter.paint(
          canvas, Offset(startX + firstPainter.width + middlePainter.width, 0));
    }
  }

  
  bool shouldRepaint(covariant CustomPainter oldDelegate) => true;
}

2.UI部分

        Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Container(
              width: 200,
              height: 40, // 设置一个足够容纳一行文本的高度
              color: Colors.grey.shade200,
              child: CustomPaint(
                size: const Size(200, 40),
                painter: MiddleEllipsisTextPainter(
                  text: '这可能导致路径错误或无法找到文件.mp3',
                  textStyle: const TextStyle(fontSize: 16, color: Colors.black),
                  maxWidth: 200,
                ),
              ),
            ),
            const SizedBox(
              height: 20,
            ),
            Container(
              width: 200,
              height: 40, // 设置一个足够容纳一行文本的高度
              color: Colors.grey.shade200,
              child: CustomPaint(
                size: const Size(200, 40),
                painter: MiddleEllipsisTextPainter(
                  text: 'Recording_1_long_long_long.wav',
                  textStyle: const TextStyle(fontSize: 16, color: Colors.black),
                  maxWidth: 200,
                ),
              ),
            )
          ],
        )

http://www.kler.cn/news/324801.html

相关文章:

  • 基于Node.js+Express+MySQL+VUE新闻网站管理系统的设计与实现
  • 小程序原生-地理定位功能介绍和实现
  • Service和Endpoints
  • 使用C#,MSSQL开发的钢结构加工系统
  • 如何在iPad上用Chrome实现无痕浏览
  • Acwing 快速幂
  • 力扣 简单 876.链表的中间结点
  • Leetcode面试经典150题-383.赎金信
  • 2024年【电工(高级)】考试题及电工(高级)考试内容
  • ISO 21434车辆网络安全风险评估的全面流程解析
  • 小柴冲刺软考中级嵌入式系统设计师系列二、嵌入式系统硬件基础知识(3)嵌入式系统的存储体系
  • 大模型落地需要一把“梯子”
  • 酒店智能开关的组成与功能
  • 【第十四周】PyTorch深度学习实践1
  • 浅说差分算法(上)
  • excel-VBA知识点记录
  • 服务器数据恢复—SAN环境下LUN映射出错导致文件系统一致性出错的数据恢复案例
  • 物联网系统中OLED屏主流驱动方案详解
  • 每日OJ题_牛客_HJ108求最小公倍数_C++_Java
  • unixODBC编程(四)插入数据
  • 【js】Node.js的fs的使用方法
  • 长沙某公司.Net高级开发面试题
  • 【C语言零基础入门篇 - 15】:单链表
  • 甄选范文“论应用服务器基础软件”,软考高级论文,系统架构设计师论文
  • 静态路由和默认路由(实验)
  • 海滨体育馆管理系统:SpringBoot实现技巧与案例
  • 活动在线报名小程序源码系统 自主提交表单+创建表单 带完整的安装代码包以及搭建部署教程
  • LiveGBS流媒体平台GB/T28181功能-支持电子放大拉框放大直播视频拉框放大录像视频流拉框放大电子放大
  • 小阿轩yx-Ansible部署与应用基础
  • linux semaphore信号量操作