TextView性能瓶颈,渲染优化,以及StaticLayout的一些用处

TextView性能瓶颈,渲染优化,以及StaticLayout的一些用处- https://www.jianshu.com/p/9f7f9213bff8

    TextView高频度绘图下的问题,在一些场景下,比如界面上有大量的聊天并且活跃度高,内容包含了文字,emoji,图片等各种信息的复杂文本,采用TextView来展示这些内容信息。就容易观察到,聊天消息在频繁刷新的时候,性能有明显下降,GPU火焰图抖动也更加频繁。

-- Android Studio中xml文件中的TextView的text中字符串属性默认大写- https://blog.csdn.net/liujunpen/article/details/53406119
<item name="android:textAllCaps">false</item>,

android:textAllCaps="false"


   StaticLayout的用途:
a.文中高频度大量textview刷新优化。
b.一个textview显示大量的文本,比如一些阅读app。
c. 在控件上画文本,比如一个ImageView中心画文本。
d. 一些排版效果,比如多行文本文字居中对齐等。

自定义View如下:
public class StaticLayoutView extends View {
        private Layout layout;
        private int width ;
        private int height;

        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        public StaticLayoutView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            super(context, attrs, defStyleAttr, defStyleRes);
        }

        public StaticLayoutView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }

        public StaticLayoutView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        public StaticLayoutView(Context context) {
            super(context);
        }

        public void setLayout(Layout layout) {
            this.layout = layout;
            if (this.layout.getWidth() != width || this.layout.getHeight() != height) {
                width = this.layout.getWidth();
                height = this.layout.getHeight();
                requestLayout();
            }
        }

        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            canvas.save();
            if (layout != null) {
                layout.draw(canvas, null, null, 0);
            }
            canvas.restore();
        }

        @Override
        protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
            super.onLayout(changed, left, top, right, bottom);
        }

        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            if (layout != null) {
                setMeasuredDimension(layout.getWidth(), layout.getHeight());
            } else {
                super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/shareus/article/details/80211148