ellipsize_end textview

不少时候,文本显示是有限制的,有个maxline,而后要求你末尾截取,最后一行末尾是...(xxx文本...),那么只要在你的xml里设置 ellipsize_end 就好了,可是有时候每每需求就是千奇百怪,系统控件没法知足产品的要求异步

好比下图效果测试

这个textview在末尾要留必定的空白,由于末尾同行有个索引,这时候系统的end模式已经没法实现,若是你在xml中把textview的ellipsize设置为end,那么末尾文字会直接到最右边,跟后面的索引样式重叠了xml

设想blog

而后你可能会联想到一个经常使用的控件效果,折叠TextView,文字过长,末尾会显示所有,把多出文本收拢,而后在想,若是本身把所有设置成空格是否是就能够达到这个效果呢,固然,能够去看看大体源码实现,是否可行,当时为了偷懒,其实本人就是这么想的,索引

一看代码,感受可行,由于我看到了一个属性 Layout,而Layout里有个方法, getLineCount(),这个方法能够获取文本的行数,行数我都知道,那怎么玩还不是本身说了算,因而就开搞了,一切很完美,效果nice,可是后面的...过短了,仍是会遮住索引,而后为了偷懒,ip

就用一开始的设想,加空格解决了,反正都是不可见的,效果同样,想要隔多少,那还不是本身说了算,因而就仿照折叠textview的效果,把这个所有变成空格,这样末尾不就是空白了,完美收工get

问题出现源码

空格是加了,加上后一看效果,通常状况很完美,可是有个特例,就是当文本差点到达 end 模式的要求时,就是假设你maxlie是2,可是标题文本就是差几个字符才会超出两行,那么此时,是触发不了ellipsize效果的,由于getLineCount()返回的是2,不会进入end模式中去,而后本身脑洞大开,继续延续以前的思路,空格大发,我留白的地方都是空格,那么竟然文本差了几个空格,我给它不上不久行了,反正末尾都是留白,不影响,因而空格加上,这时候真正的问题就来了string

死胡同产品

凡是都有个可是,通过本身测试,通常状况下,的确没问题,不过若是你的文本末尾是空格,那么end模式触发不了,而后本身就觉得是文本空格没计算进去,赶上打个断点,可是发现的确文本末尾有不少空格,那时候还试了几回,一直叠加空格,由于担忧空格不够没触发,后面加了一行空格了,仍是那样,因而进入系统方法去查看,后面发现了问题所在,原来是getLineCount()方法仍是返回2,我文本长度明明已经超过了这个长度,但是getLineCount()确好像对末尾的空格不计算长度,因此致使这个状况不起做用,而后就开始研究为何getLineCount()返回2不是3,查了好多资料无论用,只要是空格就不会计算,而后本身还想过是否是后面直接加串文字,而后把那部分文字设置成透明颜色得了,越想越离谱了都

醒悟,换个思路

因而就是问了下群里的大佬,大佬说,我无论你getLineCount()是否是有什么问题,首先你要实现什么效果,而后我老实芭蕉的告诉他,我要这个,和那个,而后大佬说,本身本身测量一下有那么难?真是一语点醒梦中人啊,有时候陷进去了就很难从那个模式中出来,后来决定抛弃前面的设想不用getLineCount()了,本身测量文字,那不是很简单的事,为何必定要如今那个getLineCount()上面,并且还有那么多骚操做,而后本身直接自定义了个简单的textview,直接重写setText方法,测量,而后直接substring简单,方便

上面还特地注释了getLineCount()这个吭,而后一步步测量,获得本身想要的信息,末尾由于要给索引留白,因此写的-6,这里能够本身配置,这里比较简单就固定了,run一下

可是少年,你觉得这就完了?

此时你还会发现,测量是在初始化后,这个是异步的,刷新的时候你会发现会有闪烁,由于以前看过折叠textview之类控件的作法,因此知道须要加个flag,初始化后就不须要再次监听了

此时很完美,可是少年,你又觉得就完了?

此时又回到了上面提到过的问题,若是个人内容恰好差几个字符知足条件呢,测量出来的line仍是2,不会进入end模式,可是此时已经不须要getLineCount()了,由于line是本身测量的,固然也不须要空格大发了,骚操做要不得,我这里竟然能测量算出超出两行,那么我也能算出是否超出1.7行,1.5行,只要你感想,我就敢作

加个判断,就算你差几个字符,我照样仍是能让你进入end模式,你会发现这个时候很好扩展了,这本身的东西就是不同哈,在run一下,非常完美,你会发现标题已经变成了

 

 后面的留白能够本身把控,最后看下效果图

使用跟原生同样,由于是重写的setText

相关文章
相关标签/搜索