详解Android TextView属性ellipsize多行失效的解决思路
作者:阴月有晴_ 发布时间:2022-03-02 16:00:32
标签:Android,TextView,ellipsize
本文介绍了Android TextView属性ellipsize多行失效的解决思路,分享给大家,具体如下:
多余文字显示省略号的常规做法
android:ellipsize="end" //省略号显示在末尾
android:ellipsize="middle" //省略号显示在中间
但是设置android:maxLines="2" 以后,ellipsize的值end有效,middle无效,本方法解决middle无效的问题
/**
* 字符串显示到textView, textView maxLines=2
* 如果字符串太长显示不下,则用省略号代替
* 省略号的位置在第一行末尾
*
* @param textView 显示字符串的view
* @param str 要显示的字符串
* @param width 显示字符串的view的宽
* @return 处理后带省略号的字符串
*/
private String ellipsizeString(TextView textView, String str, int width) {
Paint paint = textView.getPaint();
//文字总宽小于2倍的view宽,说明小于2行,直接返回
if (paint.measureText(str) < 2 * width) {
return str;
}
//存储显示到view的每行文字
List<String> list = new ArrayList<>();
int len = 0;
int start, end = 0;
while (len < str.length()) {
len += end;
int count = paint.breakText(str, end, str.length(), true, width, null);
start = end;
end = end + count;
list.add(str.substring(start, end));
}
//第一行文字末尾三个字符替换成省略号
String line1 = list.get(0);
line1 = line1.substring(0, line1.length() - 3) + "...";
//最后一行半的文字从末尾向前截取一行文字
String endLine = list.get(list.size() - 1);
int endLineWidth = (int) paint.measureText(endLine);
String minorEndLine = list.get(list.size() - 2);
int minorCuteCount = paint.breakText(minorEndLine, 0, minorEndLine.length(), true, endLineWidth, null);
String line2 = minorEndLine.substring(minorCuteCount, minorEndLine.length()) + endLine;
return line1 + line2;
}
代码的核心方法
paint.measureText(str) //测量字符串的宽度
paint.breakText(str, end, str.length(), true, width, null); //计算指定宽度下显示的字符串数量
都是api的方法,详细见源码
需要完善的地方,android设备的不同字符显示的宽度不同,三个字母替比省略号三个点要宽,m字符比l字符占位要宽,所以上面的方法处理后的字符串并不能使省略号显示到第一行末尾,有需要的可以在替换省略号那行代码那里精确处理一下,思路可以用上面的两个核心方法做一系列判断。
来源:https://www.jianshu.com/p/7edcc935640e
0
投稿
猜你喜欢
- 一、传递参数既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员(方法、属性、索引器、运算符和构造函数)更改参数的值,并保持该更
- 本文实例总结了C#实现按照指定长度在数字前补0方法。分享给大家供大家参考。具体分析如下:这里分析了C#按照指定的长度在数字前补0的两种方法例
- 上转型对象:子类创建对象 并将这个对象引用赋值给父类的对象。语法格式:Father f=new Son();注意事项:上转型对象是由子类创建
- 前言:什么是JDBCJava 数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户
- 最近看Android FrameWork层代码,看到了ThreadLocal这个类,有点儿陌生,就翻了各种相关博客一一拜读;自己随后又研究了
- 开门见山 项目运行的环境里面已经有该项目的所有代码依赖,所以项目的代码只要将自己的代码打入进去就能提交到环境中运行了。但是不好的地方就是项
- 本文实例为大家分享了java批量解析微信dat文件的具体代码,供大家参考,具体内容如下微信图片默认路径:C:\Users\b-eet\Doc
- Java的常量池通常分为两种:静态常量池和运行时常量池静态常量池:class文件中的常量池,class文件中的常量池包括了字符串(数字)字面
- 在正式的进入主题之前,我们先来了解下深拷贝和前拷贝的概念:浅拷贝:会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝,如果属性是基本
- Mybatis采用责任链模式,通过 * 组织多个 * (插件),通过这些 * 可以改变Mybatis的默认行为(诸如SQL重写之类的),由
- 新公司工程是用Maven管理的,技术上使用了JPA,但是我导入工程到MyEclipse时,applicationContext.xml中提示
- 近期开发收音机有个需求,将频率值以图片的形式显示出来(如结尾效果图所示)。然而,一开始用TextView写出来的效果太丑了,提交上去肯定不合
- 前言不知道大家对const和readonly这两个关键字的区别有什么了解,原来自己之前还真不清楚它们到底是怎么回事,那么如果你也不是很清楚的
- 前言当某个事件需要被监听的时候,我们需要去做其他的事前,最简单的方式就是将自己的业务 方法追加到该事件之后。但是当有N多个这样的需求的时候我
- 此段小代码演示了spring aop中@Around @Before @After三个注解的区别@Before是在所拦截方法执行之前执行一段
- forword跳转页面的三种方式:1.使用serlvet/** * 使用forward跳转,传递基本类型参数到页面  
- 概述:@Valid是使用Hibernate validation的时候使用@Validated是只用Spring Validator校验机制
- 本文实例讲述了Android开发获取重力加速度和磁场强度的方法。分享给大家供大家参考,具体如下:Android获取重力加速度和磁场强度主要依
- File类简介package com.file;import java.io.File;import java.io.IOException
- 在JAVA克隆对象不能简单的使用clone方法,clone方法只是进行浅克隆。请看下方:深度克隆类:Java代码 import java.i