使用TextView显示过长的文字时往往需要省略部分内容,但是TextView控件在maxline>=2时(即多行显示),ellipsize属性只有设置为end才有效,start\middle则无效.因此我们要对此情况进行处理.

处理方式和逻辑见如下代码和注释:

 public static void ellipsize(TextView textView, String content) {TextUtils.TruncateAt ellipsize = textView.getEllipsize();if (ellipsize != TextUtils.TruncateAt.START && ellipsize != TextUtils.TruncateAt.MIDDLE) { // 只处理start和middle的截断textView.setText(content);return;}int maxLine = TextViewCompat.getMaxLines(textView);int availableWidth = textView.getWidth() - textView.getPaddingLeft() - textView.getPaddingRight();if (maxLine < 2) { // 单行,或没做行数限制textView.setText(content);} else {List<Point> linesStart = getLineStartAndEnd(textView.getPaint(), content, availableWidth);if (linesStart.size() <= maxLine) { // 行数没有超过限制,不做处理textView.setText(content);return;}if (ellipsize == TextUtils.TruncateAt.START) {int start = linesStart.get(linesStart.size() - maxLine).x;start = Math.max(start + ELLIPSIS_NORMAL.length(), 0);String substring = content.substring(start);// 裁剪文字,直到在行数范围内可显示while (getLayout(textView.getPaint(), ELLIPSIS_NORMAL + substring, availableWidth).getLineCount() > maxLine) {int firstSpace = substring.indexOf(' '); // 空白字符if (firstSpace == -1) {substring = substring.substring(1);} else {substring = substring.substring(firstSpace + 1);}}textView.setText(ELLIPSIS_NORMAL + substring);} else { // middleint middleLineStart = (maxLine - 1) / 2;Point point = linesStart.get(middleLineStart);int startEllipsize = point.y - ELLIPSIS_NORMAL.length();// 在中间行的末尾追加省略号final String substringStart = content.substring(0, startEllipsize); // 省略号前面的文字int middleLineEnd = linesStart.size() - (maxLine - (maxLine - 1) / 2 - 1);Point pointEnd = linesStart.get(middleLineEnd);String substringEnd = content.substring(pointEnd.x);// 裁剪省略号后面的文字,直到整体在行数范围内可显示while (getLayout(textView.getPaint(), substringStart + ELLIPSIS_NORMAL + substringEnd, availableWidth).getLineCount() > maxLine) {int firstSpace = substringEnd.indexOf(' '); // 空白字符if (firstSpace == -1) {substringEnd = substringEnd.substring(1);} else {substringEnd = substringEnd.substring(firstSpace + 1);}}textView.setText(substringStart + ELLIPSIS_NORMAL + substringEnd);}}}/*** 计算每一行的开始字符位置和结束字符位置* @return List.size()为总行数.point.x 为当前行的开始字符位置, point.y 为当前行的结束字符位置*/private static List<Point> getLineStartAndEnd(TextPaint tp, CharSequence cs, int lineWidth) {// StaticLayout是android中处理文字换行的一个工具类,StaticLayout已经实现了文本绘制换行处理StaticLayout layout = new StaticLayout(cs, tp, lineWidth, Layout.Alignment.ALIGN_NORMAL,1.0f, 0.0f, true);int count = layout.getLineCount();List<Point> list = new ArrayList<>();for (int i = 0; i < count; i++) {list.add(new Point(layout.getLineStart(i), layout.getLineEnd(i)));}return list;}

效果

github

完整代码封装在github上的Androids项目中的EllipsizeUtils类中.

Androids项目是本人根据平时的项目实践经验,为了提高Android开发效率而写的一个工具SDK;里面提供了一些工具类以及自定义View,可在实际项目开发时直接使用。

谢谢大家支持!

Android支持多行文本省略Ellipsize相关推荐

  1. android ellipsize 多行,android TextView多行文本(超过3行)使用ellipsize属性无效问题的解决方法...

    android TextView多行文本(超过3行)使用ellipsize属性无效问题的解决方法 布局文件中的TextView属性 复制代码 代码如下: android:id="@+id/b ...

  2. android文字多行滚动显示,Android TextView多行文本滚动实现

    Android中我们为了实现文本的滚动可以在ScrollView中嵌入一个TextView,其实TextView自己也可以实现多行滚动的,毕竟ScrollView必须只能有一个直接的子类布局.只要在l ...

  3. android 决TextView中MaxLines与ellipsize=end冲突问题

    今天,讲讲如何在多行文本后显示省略号. TextView控件有一个属性是ellipsize,指的是当文字内容长度超过TextView大小时显示问题,一般情况下我们都是用省略号表示,常用的情况有以下四种 ...

  4. android采用什么图标单位,Android支持的长度单位

    dp(dip): device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这个,不依赖 ...

  5. 单行文本与多行文本省略文本

    一.单行文本省略     1.text-overflow:ellipsis;该属性用于当文本溢出的时候用省略号的方式显示.它还有一个属性值是clip(溢出部分直接裁剪掉). 2.overflow:hi ...

  6. 【Xamarin.Android】掌握android支持库

    Android支持库是每个Android应用程序中必不可少的一部分,你会发现它们无处不在.支持库为开发人员提供了将Android的最新和最强大功能添加到应用程序的能力,同时保持与旧版本Android的 ...

  7. android支持平台,Android 平台功能

    Android 平台功能Android Platform Features 12/11/2019 本文内容 开发 Xamarin.Forms 适用于 Android 的应用程序需要 Visual St ...

  8. android studio多媒体播放器,Android支持全屏、小窗口的视频播放器

    NiceVieoPlayer Android支持全屏.小窗口的视频播放器,完美实现全屏.小窗口播放切换 Features 用IjkPlayer/MediaPlayer + TextureView封装, ...

  9. 谷歌使用AndroidX代替Android支持库

    \ 看新闻很累?看技术新闻更累?试试下载InfoQ手机客户端,每天上下班路上听新闻,有趣还有料! \ \\ 新的Android扩展库(AndroidX)取代了使用七年之久的Android支持库,旨在简 ...

最新文章

  1. 关于JTable的使用
  2. VTK:可视化算法之CreateBFont
  3. springCloud Finchley 实战入门(基于springBoot 2.0.3)【六 Hystrix 仪表盘】
  4. Pandas高级教程之:plot画图详解
  5. 为什么说拥抱.NET CORE的时候到了
  6. LNMP里常见的502问题
  7. Spring Cloud Alibaba基础教程版本升级:0.2.1-gt;0.2.2
  8. react-native开源组件react-native-wechat学习
  9. 拓端tecdat|Nelsen-Siegel—Svensson扩展模型简介
  10. vue 获取跳转上一页组件信息
  11. 20200521每日一句
  12. X4扭曲字体或图形 coreldraw_CorelDRAW X4案例教程上-电子教案文档.ppt
  13. Jenkins 登录时离线 offline
  14. BlueScreen
  15. 如何交叉编译openssl、openssl 移植到ARM、IOT设备上
  16. Missing Values(缺失值)
  17. golang:IO File 操作
  18. 高防服务器有哪些优势
  19. VS2010编译静态链接MFC的OCX遇到的问题:nafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12 已经在 LIBCMTD.lib(dllm
  20. 舆情监测技术方案,网络舆情分析技术手段有哪些?

热门文章

  1. Ubuntu 创始人爆粗口:开源社区弥漫着“反社会人格”
  2. 内存泄漏常见场景及处理方法
  3. 拒不修图的拍摄软件,这一刻APP能否在美图时代生存?
  4. 分别声明Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类Teacher_Cadre(教师兼干部)类。要求: (1)在两个基类中都包含姓名、年龄、性别、地址、电话等数
  5. 基于CANoe的SecOC实现
  6. autojs之开启悬浮窗权限
  7. salesforce 和微信的集成(一)通过SFDC Site打开微信开发接口
  8. TRTC Web SDK新架构设计解析(GMTC逐字稿)
  9. 获取当前服务器ip地址
  10. 仿站(HTML+CSS)