面试View绘制流程

1. View绘制流程


performMeasure、performLayout、performDraw

1>:performMeasure:测量xml中所有控件的宽高
对于view:它的宽高由自己和父布局决定,比如:
如果父布局是 wrap_content,就算子布局是 match_parent,测量模式也是 AT_MOST;
如果父布局是 match_parent,子布局是 match_parent,测量模式 EXACTLY;
对于ViewGroup:先测量每个子view宽高,然后根据子view宽高计算自己宽高;

2>:performLayout:摆放子布局,for循环摆放所有子view,调用 view.layout;
view.layout__view.onLayout,这个方法什么都没做,然后看 ViewGroup的 onLayout,比如LinearLayout的onLayout,for循环遍历所有子view,调用child.layout,代码中调用 setText、setImageView等都是重新摆放布局:
对于LinearLayout垂直方向,有3个TextView:所有子view高度top叠加;
对于LinearLayout水平方向,有3个TextView:所有子view宽度left叠加;

面试View绘制流程_第1张图片
图片.png

3>:performDraw:绘制自己和子view
对于View:绘制文字drawText,绘制ImageView调用 drawBitmap;
对于ViewGroup:首先调用 view.draw,它有3个方法:
drawBackground:画背景;
onDraw:画自己,ViewGroup默认不会调用 onDraw;
dispatchDraw:画子view,for循环不断调用子view的 draw;

面试View绘制流程_第2张图片
图片.png

你可能感兴趣的:(面试View绘制流程)