如何使用;TextLayoutView";Instagram在Android上改进TextView渲染中的应用

如何使用;TextLayoutView";Instagram在Android上改进TextView渲染中的应用,android,textview,rendering,instagram,Android,Textview,Rendering,Instagram,为了改进Instagram中的TextView渲染,Instagram中的工程师提供了一种破解方法,他们使用自定义视图(TextLayoutView)来缓存text.Layout,但在本文中,他们没有给我们演示或告诉我们如何使用它,所以如果我想使用这种破解方法,我该怎么做?这是我的简单实现: 文本布局视图: public class TextLayoutView extends View { private Layout mLayout; public TextLayoutView(Cont

为了改进Instagram中的TextView渲染,Instagram中的工程师提供了一种破解方法,他们使用自定义视图(TextLayoutView)来缓存text.Layout,但在本文中,他们没有给我们演示或告诉我们如何使用它,所以如果我想使用这种破解方法,我该怎么做?

这是我的简单实现:

文本布局视图:

public class TextLayoutView extends View {

private Layout mLayout;

public TextLayoutView(Context context) {
    this(context, null);
}

public TextLayoutView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

public TextLayoutView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    setFocusable(true);
}

@Override
protected void onDraw(Canvas canvas) {
    long t1=System.currentTimeMillis();
    super.onDraw(canvas);
    canvas.save();
    if (mLayout != null) {
        canvas.translate(getPaddingLeft(), getPaddingTop());
        mLayout.draw(canvas);
    }

    canvas.restore();
    long t2=System.currentTimeMillis();
    Log.i("TEST", "onDraw::"+(t2-t1));
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    long t1=System.currentTimeMillis();
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    if (mLayout != null) {
        setMeasuredDimension(
                getPaddingLeft() + getPaddingRight() + mLayout.getWidth(),
                getPaddingTop() + getPaddingBottom() + mLayout.getHeight());
    }
    long t2=System.currentTimeMillis();
    Log.i("TEST", "onMeasure::"+(t2-t1));
}


public void setTextLayout(Layout layout) {
    mLayout = layout;
    requestLayout();
}}
您可以这样使用它:

    @Override
public View getView(int position, View convertView, ViewGroup parent) {
    ......
    viewHolder.textView.setTextLayout(getLayout(mList.get(position)));
    return convertView;
}
    private final Map<String, Layout> mLayoutMap = new ConcurrentHashMap<String, Layout>();
private Layout getLayout(String str) {
    Layout layout = mLayoutMap.get(str);
    if (layout == null) {
        TextPaint textPaint = new TextPaint();
        textPaint.setTextSize(20);
        layout = new StaticLayout(str, textPaint, width, Alignment.ALIGN_CENTER,
                1.0f, 0.0f, true);
        mLayoutMap.put(str, layout);
    }
    return layout;
}
@覆盖
公共视图getView(int位置、视图转换视图、视图组父视图){
......
viewHolder.textView.setTextLayout(getLayout(mList.get(position));
返回视图;
}
私有最终映射mLayoutMap=新的ConcurrentHashMap();
私有布局getLayout(字符串str){
Layout Layout=mLayoutMap.get(str);
if(布局==null){
TextPaint TextPaint=新建TextPaint();
textPaint.setTextSize(20);
布局=新的静态布局(str、textPaint、width、Alignment.ALIGN\u CENTER、,
1.0f,0.0f,正确);
mLayoutMap.put(str,布局);
}
返回布局;
}

我为它创建了GitHub Repo。我为它创建了GitHub Repo。