StaticLayout 带收缩和展开的简单自定义 TextView

先看效果:

expandtextview.gif

看到这个效果很多人可能会说 github上很多开源的呀。干嘛还要造轮子呢。github确实有很多这样效果的项目。用起来也都不错。可我偏偏就是造轮子了。。。最主要的原因是最近想优化app的渲染性能。想来app当中最主要的特性就是图片多和文字。图片优化这个模块二优化时间长。还牵扯到了加密,解密,服务器处理方式,客户端优化方式等等问题还是觉得优化文本渲染可能来的快点。刚好ui设计师有上面效果的一个需求。看了几个github上的项目。感觉布局有点复杂。感觉渲染速度还是不够好。导致的重复绘制也增加了渲染时间成本。所以决定研究下系统的textview的计算,排班。渲染是怎么操作的。在阅读textview部分源码的过程中也弄清了计算,排班。

主要三个辅助类: 

① BoringLayout 主要适合单行文本显示的情况 

② DynamicLayout 主要特性是在支持多行的情况下最关键的特性是监听文本的改动,静态文本显示 不建议使用这个,性能略低StaticLayout

③ StaticLayout 顾名思义特点适合多行静态文本显示的情况

由于app当中很大部分文本都是静态显示的效果,所以本文主要使用的就是StaticLayout,textview的计算过程主要在setText(String or StrResId) 过程中。流程包括了检查操作一系列流程。二上面的动画如果用过于复杂的布局实现,那在动画渲染的过程中性能按理说不是很好。既然这样索性就自己写啦。期间发现了最nice的文章 《staticlayout源码分析》 也谢谢作者分析的透彻。伙伴们可以谷歌直接找到。这里面基本有你想要的很大部分。

上面效果中最烦心的就是当指定显示行数 maxLines< totalCount ( 全部文本显示出来的行数 ) 当中第 maxLines 行中 【文本】【省略点】【图标】的横向排版部分。同事还要注意没有图标的情况。需要自己在初始化的时候计算下。利用 canvas 绘制在画布上。另外当 maxLines >= totalCount 的时候 【省略点】【图标】是不能显示的,具体的行数也是文本真实的行数 totalCount, 而不是说 指定的行数 maxLines。具体的代码大家可以看看啦。写了部分注释了的。动画使用了属性动画,所以兼容性只考虑系统3.0以后的情况。如需兼容性更好,总是有大神实现了。著名的 NineOldAndroids

最后 github地址啦:https://github.com/igeek-YZ/ExpandTextView