如何使用;TextLayoutView";Instagram在Android上改进TextView渲染中的应用
为了改进Instagram中的TextView渲染,Instagram中的工程师提供了一种破解方法,他们使用自定义视图(TextLayoutView)来缓存text.Layout,但在本文中,他们没有给我们演示或告诉我们如何使用它,所以如果我想使用这种破解方法,我该怎么做?这是我的简单实现: 文本布局视图:如何使用;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
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。