在做布局优化的时候,需要在布局中定位到渲染时长比较长的控件去进行针对性的优化。那要怎么做呢?可以借助 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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {getLayoutInflater().setFactory2(new LayoutInflater.Factory2() {@Overridepublic 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;}@Overridepublic View onCreateView(String name, Context context, AttributeSet attrs) {return null;}});super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}
}
通过调用 setFactory2() 方法并传递自定义的 Factory2 实例,可以拦截和修改 LayoutInflater 创建视图对象的过程。拦截后可以做任何想做的事,例如动态地改变视图的外观、行为或属性。
核心思想就是计算单个 View 渲染前后的时间差,这样就知道单个控件的渲染时长了,知道了单个渲染时长就能对单个耗时长的控件做针对性优化
需要注意的是,设置这个监听需要在 setContentView() 之前调用(因为如果都渲染完了,再设置监听那肯定就无效了)