レイアウトの最適化を行う場合、ターゲットを絞った最適化を行うために、レンダリング時間が比較的長いコントロールをレイアウト内に配置する必要があります。どうやってするの?これは、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() よりも前に呼び出す必要があることに注意してください(すべてのレンダリングが終了すると、モニターの設定は確実に無効になるため)