TextView如何优化

Posted by Jfson on 2018-05-12

大量文本刷新时,性能出现瓶颈,譬如:直播中的聊天

绘制 和 measure 时间比较长

优化

  • 1.节省 measure 时间,Android有很多用于文字展示的控件,但实际上,他们都用text.Layout进行渲染。例如,TextView会将String转化为一个text.Layout对象,并通过canvas API将它绘制到屏幕上。
    由于text.Layout需要在构造函数中测量文本的高度,因此它的创建效率不高。缓存text.Layout和复用text.Layout实例可以节省这部分时间

  • 2.在可以设置text.Layout缓存后,我们的到来常数级的测量(measure)和绑定(binding)时间。但是初次绘制的时间仍然很长。50ms的绘制时间可能会导致明显的卡顿。
    这50ms中的大部分被用于测量文本高度以及产生文字符号。这些都是CPU操作。为了提升文本渲染速度,Android在ICS中引入了TextLayoutCache用于缓存这些中间结果。TextLayoutCache是一个LRU缓存,缓存的key是文本。如果查询缓存时命中,文本的绘制速度会有很大提升

  • 3.强制使用Staticlayout

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    TextView包含了3种布局:
    a. BoringLayout (单行纯文字文本)
    b. Staticlayout (多行复杂文本)
    c. DynamicLayout (多行可编辑复杂文本)
    强制使用Staticlayout
    4 StaticLayout的用途
    a.文中高频度大量textview刷新优化。
    b.一个textview显示大量的文本,比如一些阅读app。
    c. 在控件上画文本,比如一个ImageView中心画文本。
    d. 一些排版效果,比如多行文本文字居中对齐等。

参考

Instagram是如何提升TextView渲染性能的

StaticLayout


pv UV: