在做布局优化的时候,需要在布局中定位到渲染时长比较长的控件去进行针对性的优化。那要怎么做呢?可以借助 LayoutInflater 的 Factory2 来实现
LayoutInflater.setFactory2() 方法用于设置 LayoutInflater.Factory2,它可以拦截和修改 LayoutInflater 在解析布局文件时创建视图的过程。通过设置 Factory2,可以对创建的视图进行自定义处理,例如修改视图属性、替换视图类型等。
package android.view;
public abstract class LayoutInflater {
// ...
public final View tryCreateView(View parent, String name, Context context, AttributeSet attrs) {
View view;
if (mFactory2 != null) { // 若 mFactory2 不为空,则回调
view = mFactory2.onCreateView(parent, name, context, attrs);
} else {
view = null;
}
// ...
return view;
}
// ...
}
每一个控件在创建时,若 Factory2 不为空时,都会执行回调
使用:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
getLayoutInflater().setFactory2(new LayoutInflater.Factory2() {
@Override
public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
long time = System.currentTimeMillis();
View view = getDelegate().createView(parent, name, context, attrs);
Log.i("kang", name + " 耗时:" + (System.currentTimeMillis() - time));
return view;
}
@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
return null;
}
});
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
通过调用 setFactory2() 方法并传递自定义的 Factory2 实例,可以拦截和修改 LayoutInflater 创建视图对象的过程。拦截后可以做任何想做的事,例如动态地改变视图的外观、行为或属性。
核心思想就是计算单个 View 渲染前后的时间差,这样就知道单个控件的渲染时长了,知道了单个渲染时长就能对单个耗时长的控件做针对性优化
需要注意的是,设置这个监听需要在 setContentView() 之前调用(因为如果都渲染完了,再设置监听那肯定就无效了)