如何使用 Instagram 的“TextLayoutView”改进 Android 上的 TextView 渲染

Posted

技术标签:

【中文标题】如何使用 Instagram 的“TextLayoutView”改进 Android 上的 TextView 渲染【英文标题】:How to use "TextLayoutView" of Instagram in improving TextView Rendering on Android 【发布时间】:2015-04-25 02:21:58 【问题描述】:

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

【问题讨论】:

我为它创建了 GitHub Repo。 github.com/Kishanjvaghela/TextLabel 【参考方案1】:

这是我的简单实现:

TextLayoutView:

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;

【讨论】:

我为它创建了 GitHub 存储库。 github.com/Kishanjvaghela/TextLabel

以上是关于如何使用 Instagram 的“TextLayoutView”改进 Android 上的 TextView 渲染的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Instagram软件加好友

如何使用 Instagram 的“TextLayoutView”改进 Android 上的 TextView 渲染

如何使用 Selenium 在 Instagram 弹出框中向下滚动

如何使用 selenium (Python) 定位 Instagram 关注按钮

如何使用 Instagram 的 API 显示我自己的照片库?

如何成为 Instagram 中任何客户的 Instagram 沙盒用户