View绘制流程(待补充)
View绘制流程
问题:子线程可以更新view吗
setText会不断向上调用View.requestLayout
ViewRootImpl:checkThread方法的调用是关键
控件树的结构
setContentView
时发生了什么
#Activity
getWindow().setContentView(layoutResID);
Activity内有一个PhoneWindow extend Window
#PhoneWindow
installDecor() {
DecorView mDecor = generateDecor(-1);
ViewGroup mContentParent = generateLayout(mDecor);
}
setContentView时PhoneWindow会创建一个DecorView extend Framelayout,这样window就和view联系起来了
然后generateLayout中会根据主题修改窗口布局,有两次一次从style.xml 另一次时requestWindowFeature的配置
#PhoneWindow
generateLayout (DecorView d) {
根据主题找一个layoutResource
mDecor.onResourcesLoaded(mLayoutInflater, layoutResource);
}
#DecorView
void onResourcesLoaded(LayoutInflater inflater, int layoutResource) {
final View root = inflater.inflate(layoutResource, null);
addView(root, 0, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
}
把传入的 layoutResource add 进 DecorView
#PhoneWindow
ViewGroup contentParent = (ViewGroup)getDecorView().findViewById(之前layoutResource中的content)
拿出布局中的contentParent
#PhoneWindow
public void setContentView(int layoutResID) {
mLayoutInflater.inflate(layoutResID, 上面的contentParent);
}
DecorView 的父控件 ViewRootImpl
ViewRootImpl在WindowManagerGlobal的addView中被创建–>WindowManagerImpl的addView方法 –> ActivityThread的handleResumeActivity方法
SurfaceView
独有一个surface,通过surfaceflinger合并与activity的surface绘制,总是处于最下层,所以wms把上层的view掏空,有待机黑屏问题,可以拿到surfaceview的canvanse,但也无法彻底解决
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 炎武的学习笔记!