UI绘制流程-view是如何添加到窗口上的
2020-02-09 18:34:10 0 举报
Android ui绘制流程一
作者其他创作
大纲/内容
getDecorView();
Framelayout
setContentView(int layoutResID)
将系统布局初始化,addview的方式,添加到DecorView中
修改布局的ID,为android.R.id.content
保存创建DecorView的layoutParams
final class TraversalRunnable implements Runnable { @Override public void run() { doTraversal(); } }
setContentView(int resId)
根据对应的主题特性加载相应的系统布局
保存DecorView相关联的ViewRootImpl对象
setContentView(View view)
View
测量完子容器,最后测量父容器
getDelegate().setContentView(layoutResID);
DecorView或者其他的容器
否
此时DecorView和ContentParent都不为null
ViewRootImpl
createSubDecor();
LayoutInflater
mDecor = generateDecor(-1);
performTraversals();
setContentView( int layoutResID)
通过MeasureSpec可以得到是int类型值measureSpec,前2位表示 测量模式后30位表示测量sise
通过前面修改id后的容器去添加自定义的布局
mMeasuredWidth = measuredWidth; mMeasuredHeight = measuredHeight;
是否有转场动画
PhoneWindow
doTraversal()
FrameLayout
初始化mContentParent
AppCompatActivity
installDecor();
installDecor();
getWindow().setContentView(layoutResID);
generateLayout(mDecor);
draw(Canvas canvas)
mView.draw(canvas);
拆包
保存DecorView对象
ensureSubDecor();
初始化DecorView
AppCompatDelegateImpl
WindowManagerImpl
performDraw()
mWindow.setContentView(subDecor);
Activity
获取子空间个数
host是DecorView
将subDecor添加到ContentParent中
封包
通过MeasureSpec,可以将measureSpec拆分,获取mode和size
重写onMeasure
requestLayout();
初始化subDecor
是否是ViewGroup
ActivityThread
scheduleTraversals();
scene.enter();
通过父控件的MeasureSpec,确定子空间的MeasureSpec
是
draw(fullRedrawNeeded);
ViewGroup
windowContentView.setId(View.NO_ID); contentView.setId(android.R.id.content);
WindowManagerGlobal
收藏
0 条评论
回复 删除
下一页