该网站已经迁移到:blog.xwdoor.net

TextView 超出长度显示省略号的实现原理

android xwdoor 488℃ 0评论

TextView 超出长度显示省略号的实现原理

1. 背景

今天和同事研究如何在自定义 View(非 TextView 子类)中实现跑马灯、文本超长显示省略号的问题。跑马灯先不提,今天我们来看看如何显示省略号的问题。

2. 方案

实现方案有两种:

  • 研究官方 TextView 的实现方式,模仿实现(实际上可以直接调用,代码在文章最后)
  • 使用二分法自己测量并实现字符串的截取

3. 官方实现原理

在知道 TextView 已经实现这个效果的前提下,去查看 TextView 的源码。

入口在它的属性:android:ellipsize="end"

进入 TextView.java 类,搜索「ellipsize」,会发现以下代码片段:

根据上述代码,自然而然进入 setEllipsize 方法,然后跟踪到成员属性:mEllipsize

再往下跟踪,应该就发现一下代码片段:

这个时候就发现,TextView 中实现了很多布局,其中有 BoringLayoutDynamicLayoutStaticLayout,他们都继承了 Layout,别的先不谈,我们今天研究我们关心的「BoringLayout」

(我们定位到 BoringLayout,并不仅仅依赖于上边的代码段,其实还有很多代码段跟布局有关,然后我们查看了 BoringLayout 的注释,最后才确定它就是我要找的,通过它我就能找到最终隐藏起来的实现代码)

(有了上边的思路,接下来我们要加快进程了)

定位关键流程:「BoringLayout」->「replaceOrMake」-> 「TextUtils.ellipsize」->「MeasuredText」

其实 TextUtils.ellipsize 方法已经可以实现我们要的效果了,其中的代码片段如下:

我们发现其实 TextUtils 也是借助了 MeasuredText 来实现文本的截取。具体它们之间怎么配合联动,这里先不追究,因为这里是实现效果为主,原理我们放到下一篇文章中交接。

所以我们最终的实现代码如下:

4. 二分法实现原理

不考虑效率问题,这里不推荐使用,如果觉得自己的代码很有精髓,可以自我实现,这里就不贴代码了,因为懒。

不过,勤快的同事简单的写了一个,请放心使用:「请原谅是 Java 代码」

转载请注明:xwdoor » TextView 超出长度显示省略号的实现原理

喜欢 (1)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址