StaticTextView —TextView优化
最近项目在做RecycerView的相关优化工作,发现系统提供的TextView效率不够高,setText方法每次总会消耗大概3-5ms左右,TextView作为很多view的基类,处理了很多事情比如文字变化的监听等,大大影响了bindViewHolder的时间,所以自定义了一个功能简化的TextView。
由于不需要其它特殊的功能支持,比如富文本等等,只需要提供简单的文字展示,所以使用StaticLayout去实现文字的layout控制,TextView内部有DynamicLayout、BoringLayout、StaticLayout三种,分别支持动态文本,单行文本,多行文本。
因为需要适配低版本android,StaticLayout在低版本安卓不支持builder创建,没有maxlines,ellipse相关属性,所以通过代码去实现maxline效果,对text做截取
public class StaticTextView extends View {
//行文本记录集
private List<LineText> lineTexts = new ArrayList<>();
//最大显示文本行数
private int mMaxLines = 2;
//最大显示文本行对应的本视图高度
private int maxLinesHeight;
//当前文本
private String mText;
private boolean needMeasure = true;
private TextPaint mTextPaint;
public StaticTextView(Context context) {
this(context, null);
}
public StaticTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public StaticTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initFontSize();
}
private void initFontSize() {
if (isInEditMode()) {
return;
}
mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
mTextPaint.setTypeface(Typeface.create("sans-serif-medium", Typeface.NORMAL));
mTextPaint.density = getContext().getResources().getDisplayMetrics().density;
mTextPaint.setColor(Color.BLACK);
mTextPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mTextPaint.setTextSize(UIUtils.sp2px(getContext(), 18f));
}