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字符占位要宽,所以上面的方法处理后的字符串并不能使省略号显示到第一行末尾,有需要的可以在替换省略号那行代码那里精确处理一下,思路可以用上面的两个核心方法做一系列判断。
Android-TextView属性ellipsize多行失效的解决思路的更多相关文章
- Android TextView属性
android:autoLink设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(none/web/email/phone/map/all)android:a ...
- Android——TextView属性XML详解
Android_TextView属性XML详解 博客分类: android 属性名称 描述 android:autoLink 设置是否当文本为URL链接/email/电话号码/map时 ...
- Android TextView属性大全
android:ems 设置TextView的宽度为N个字符的宽度. android:maxems 设置TextView的宽度为最长为N个字符的宽度.与ems同时使用时覆盖ems选项.android: ...
- android TextView属性详解
RelativeLayout用到的一些重要的属性: 第一类:属性值为true或false android:layout_centerHrizontal 水平居中 android:l ...
- Android TextView,EditText要求固定行数自动调整TextSize
最近项目有个需求要求文本最多显示3行,继续输入则字体变小,删除已经输入的文字,那么字体变大,不管变大变小都不能超过3行.网上怎么找也找不到相关的解决方案,自己动手,丰衣足食了! 说一下算法思路,后面给 ...
- Android TextView自动换行、排列错乱问题及解决
解决之前层次不齐的排版截图,如下图: 解决之后的整齐排版截图,如下图: 今天忽然发现android项目中的文字排版参差不齐的情况非常严重,不得不想办法解决一下 ...
- Android ScrollView 内部控件 layout_margin失效的解决方法
在<ScrollView> 的<LinearLayout >属性里面加入android:layout_gravity="top" <LinearLa ...
- android apk打包之后js调用失效的解决办法
现在android下应用开发的界面用html5+css3写,交互用javascript和java沟通,但是用上混淆后发现javascript调用java类定义的方法老说找不到这个方法.一番折腾后发现是 ...
- 新建maven的pom.xml第一行出错的解决思路
前言:博主在想要用maven创建项目的时候,忘记之前已经安装过maven了,所以再安装了另一个版本的maven,导致在pom.xml的第一行总是显示某一个jar的zip文件读取不出来. 在网上找了很多 ...
随机推荐
- Ubuntu 15 下 Qt 配置mysql链接及基本操作
序 最近需要在Linux下做一个unix网络编程项目,选择了Ubuntu 最新版本15.04 : 开发环境:Qt 5 数据库: MySQL 安装Qt 和 MySQL 简要介绍一下软件的安装! 安装Qt ...
- stm32定时器学习二——PWM设置
/* STM32 嵌入式学习入门(5)——PWM的实现 上一篇博文介绍了定时器和PWM的基本的原理,本篇博文从代码层面来介绍PWM的具体实现.同样,还是以博主所用的开发板——正点原子开发板STM32F ...
- The 2018 ACM-ICPC Chinese Collegiate Programming Contest Maximum Element In A Stack
//利用二维数组模拟 #include <iostream> #include <cstdio> #include <cstring> #include <s ...
- HDU 3667 费用流 拆边 Transportation
题意: 有N个城市,M条有向道路,要从1号城市运送K个货物到N号城市. 每条有向道路<u, v>运送费用和运送量的平方成正比,系数为ai 而且每条路最多运送Ci个货物,求最小费用. 分析: ...
- JSONP分享-- 在JavaScript中跨域请求
如果你正在开发一个现代的基于web的应用程序,那么你: 在客户端使用JavaScript. 需要集成那些没有完全在你控制之下的服务(或者那些来自不同的域). 在你的浏览器控制台中遇到过这个错误信息: ...
- C++ 获取网页源码码的操作
#include <stdio.h>#include <windows.h>#include <wininet.h>#pragma comment(lib,&quo ...
- python 学习分享-列表元组篇
1 列表(list) 下面的代码就是把一个变量赋值为列表 a=['laay','aay','ay','y'] 列表中存在索引,可以通过索引来访问列表中的值,也可以通过索引完成切片 print(a[0] ...
- [java开发篇][dom模块] 遍历解析xml
http://blog.csdn.net/andie_guo/article/details/24844351 XML DOM节点树 XML DOM将XML文档作为树结构,树结构称为一个节点树.所有的 ...
- [python测试框架学习篇] 分享一个和adb相关的测试框架
https://testerhome.com/topics/7106 (user: zteandallwinner password: same to qq ) 264768502 · # ...
- 通过FEDERATED存储引擎同步两实例间的表数据
需求情景:实例1中A库中的三个视图是实例2中的B库所依赖的,B需要A库中三个视图的实时数据. 方案:通过FEDERATED来完成跨势力的查询FEDERATED存储引擎表只会创建表结构,不会存储表数据, ...