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

news2024/11/20 0:42:33

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.coloradmin.cn/o/2177362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【无人机设计与控制】基于MATLAB的四旋翼无人机PID控制动力学建模研究制

摘要 本文研究了基于MATLAB的四旋翼无人机动力学建模和PID控制器设计。通过在Simulink中搭建四旋翼无人机的动力学模型&#xff0c;并结合经典PID控制算法&#xff0c;设计了无人机的姿态控制系统。实验结果表明&#xff0c;所设计的PID控制器能够有效稳定无人机的姿态&#x…

Gitlab 配置自动化Pipeline

在GitLab中配置CI/CD流水线&#xff08;pipeline&#xff09;以实现自动化构建和测试&#xff0c;你需要遵循以下步骤&#xff1a; 1. 创建 .gitlab-ci.yml 文件&#xff1a;在项目的根目录或子目录中创建一个名为 .gitlab-ci.yml 的文件&#xff0c;这是定义GitLab CI/CD流水…

JavaWeb之过滤器

1. 过滤器的概念 过滤器是Java Servlet规范中定义的组件&#xff0c;用于在请求到达Servlet之前或响应返回客户端之前&#xff0c;对请求或响应进行拦截和处理。过滤器可以实现以下功能&#xff1a; 日志记录&#xff1a;记录请求的详细信息&#xff0c;如URI、参数、时间等。…

Hugging Face + JuiceFS:多用户多节点环境下提升模型加载效率

Hugging Face 的 Transformers 是一个功能强大的机器学习框架&#xff0c;提供了一系列 API 和工具&#xff0c;用于预训练模型的下载和训练。为了避免重复下载&#xff0c;提高训练效率&#xff0c;Transformers 会自动下载和缓存模型的权重、词表等资源&#xff0c;默认存储在…

官方权威解读|CNAS-CL01过程部分解读,抽样部分

CNAS-CL01文件是软件测试实验室申请CNAS软件评测机构资质的重要参考材料&#xff0c;也是CNAS软件测试实验室建立质量管理体系的重要依据。近日CNAS为响应国家相关要求&#xff0c;组织开展了一系列专题调研。结合行业关注热点问题&#xff0c;推出了认可评审案例系列。前面的文…

macOS 新系统必知道:窗口分屏终于来了

对于很多从 Windows 转换到 macOS 的用户来说&#xff0c;最不习惯的一点可能就是窗口管理了。 Windows 系统自 Windows 7 开始就支持通过拖拽应用窗口至屏幕边缘来实现快速的分屏操作&#xff0c;到了 Windows 11 这一功能更是进化得更加灵活多变&#xff0c;允许用户根据需要…

临床常用的焦虑测评量表有哪些?

常笑医学整理了5个临床常用的焦虑测评量表&#xff0c;包括焦虑自评表&#xff08;SAS&#xff09;、状态-特质焦虑问卷&#xff08;STAI&#xff09;等。这些量表在常笑医学网均支持在线评估、下载和创建项目使用。 01 焦虑自评表&#xff08;SAS&#xff09; &#xff08;完…

ECCV 2024 | 融合跨模态先验与扩散模型,快手处理大模型让视频画面更清晰!

计算机视觉领域顶级会议 European Conference on Computer Vision&#xff08;ECCV 2024&#xff09;将于9月29日至10月4日在意大利米兰召开&#xff0c;快手音视频技术部联合清华大学所发表的题为《XPSR: Cross-modal Priors for Diffusion-based Image Super-Resolution》——…

原宝,四周年快乐!

原神&#xff0c;公测于2020年9月28日开启。 现在已经是第4个年头了&#xff0c;7个国家已经开放了6个&#xff0c;来到了火之国。其实自从2022年继续开放游戏版号以来&#xff0c;好品质的二次元游戏、三端游戏也是层出不穷。无论是立绘&#xff0c;建模都有非常优秀的作品。…

柯桥学英语商务口语中老外最爱说的“what‘s up“是什么意思?回答错超尴尬!

“Whats up&#xff1f;” 在看美剧或者和老外聊天的时候 我们总能听到这句话 那你知道这句老外很爱说的 “whats up”是什么意思吗&#xff1f; 快和小编一起来学习吧~ 01 whats up 怎么理解&#xff1f; 很多人觉得Whats up就是更地道的“How are you”&#xff0c;嗯………

Tkinter制作登录界面以及登陆后页面切换(一)

Tkinter制作登录界面以及登陆后页面切换&#xff08;一&#xff09; 前言序言1. 由来2. 思路3. 项目结构描述4. 项目实战1. 登录界面实现&#xff08;代码&#xff09;2. 首页界面实现&#xff08;代码&#xff09;3. 打包build.py&#xff08;与main.py同级目录&#xff09;4.…

kafka发送消费核心参数与设计原理详解

核心参数详解: 发送端参数: 发送方式:默认值一般都是1: 重试参数 : 批量参数: 消费端参数: 自动提交参数: 如果是false,就是说消费完后不提交位移。也就是说比如之前消费的1-5.第N次还是消费到1-5.如果是false。那么第一次消费1-3,第二次消费4-5:默认是true:我们…

制定六西格玛人才培养方案需要考虑哪些因素?

当下&#xff0c;六西格玛作为一种先进的质量管理方法&#xff0c;被越来越多的企业采纳并应用于日常管理和流程优化中。然而&#xff0c;要成功实施六西格玛&#xff0c;关键在于培养一支具备高度专业素养和实战能力的六西格玛人才队伍。那么&#xff0c;制定六西格玛人才培养…

基于微信小程序的交友平台

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

软件游戏运行缺少vcruntime140.dll怎么办?总结四种有效简单方法

1. 文件基本信息 1.1 定义与作用 vcruntime140.dll是Microsoft Visual C 2015 Redistributable Package的一部分&#xff0c;它包含了C运行时库&#xff0c;用于支持使用Visual C开发的Windows应用程序。这个动态链接库&#xff08;DLL&#xff09;文件提供了程序执行时所需的…

可视化服务编排:jvs-logic API出参加密实战教程

在现代软件开发与系统集成的过程中&#xff0c;API&#xff08;应用程序接口&#xff09;非常重要&#xff0c;它能使不同系统之间连接&#xff0c;进行数据交换和功能调用。当然&#xff0c;数据交换的数据安全肯定是不可忽视的&#xff0c;为了确保数据在传输过程中的保密性和…

基于Java(Spring+Struts+Hibernate 框架)实现(Web)学生课程管理系统

课程管理系统设计文档 一、更新历史 二、引言 2.1 目的 本文档详细描述了课程管理系统的设计&#xff0c;达到引导开发的作用&#xff0c;同时实现测试人员以及用户的沟通。本文档面向开发人员&#xff0c;测试人员以及最终用户编写&#xff0c;是了解系统的导航。2.2 范围…

五金精密加工提升效率的方法与技巧

在五金精密加工领域&#xff0c;提高加工效率是企业增强竞争力的关键。以下是一些有效的提升方法与技巧。 一、优化加工设备 设备升级与更新 定期评估加工设备的性能&#xff0c;引进先进的五金精密加工机床。例如&#xff0c;高精度的数控加工中心能够实现多轴联动加工&#x…

开放式蓝牙耳机哪个品牌更靠谱?5款高性价比开放式耳机推荐

谈到开放式蓝牙耳机哪个品牌更靠谱&#xff0c;市场上有许多优秀的选择。以前也经常使用入耳式耳机&#xff0c;但总是会感觉耳机插在耳朵里不舒服&#xff0c;戴久了耳朵很疼&#xff0c;跑步的时候还总掉。还有在过马路的时候接电话、听音乐&#xff0c;几乎感知不到周围环境…

【HarmonyOS】深入理解LocalStorage之逻辑处理存取

【HarmonyOS】深入理解LocalStorage 一、前言 鸿蒙应用中关于状态管理的处理机制有很多。从状态装饰器State prop等&#xff0c;LocalStrong&#xff0c;AppStrong到首选项&#xff0c;再到数据库。内存到持久化。轻量级到重量级。全方位覆盖。 学习和记忆技术点&#xff0c…