如何使用 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 的“TextLayoutView”改进 Android 上的 TextView 渲染
如何使用 Selenium 在 Instagram 弹出框中向下滚动
如何使用 selenium (Python) 定位 Instagram 关注按钮