目录
写在前面
今天这篇文章其实是我的一篇学习笔记哈,整体写的比较简单,为了日后复习用,我就把它放在了博客上,勿喷!谢谢!
一、UI绘制流程及原理
问题:View是如何被添加到屏幕窗口上的
- 创建顶层布局容器DecorView
- 在顶层布局中加载基础布局ViewGroup
- 将ContentView添加到基础布局中的FrameLayout中
源码分析:自定义测试入口类继承自Activity
public class TestActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_address_layout);
}
}
Activity:
The only existing implementation of this abstract class is android.view.PhoneWindow, which you should instantiate when needing a Window. 这里意思是它是一个抽象类,并且具有唯一的实现类PhoneWindow。
generateLayout根据系统主题的属性通过requestFeature()和setFlags()进行一系列调用。接着是进行解析窗口View,根据feature的值对layoutResource进行不同的赋值操作,初始化好layoutResource之后,通过
将layoutResource进行解析创建了一个root对象,然后将root对象添加到DecorView里面,然后重新回到上面去:
得到contentParent之后,最后将它进行返回。
总结:
接着会调用:mLayoutInflater.inflate(layoutResID, mContentParent); 将我们在activity中设置的布局资源通过xml解析添加到frameLayout中。
二、View的绘制流程
首先来看这张图,总结了View的绘制流程:
源码分析:
ActivityThread:--->handleMessage()--->LAUNCH_ACTIVITY
此时会回调Activity生命周期的onResume()方法。
接着去WindowManagerImpl中找addView()方法:
三、UI绘制详细步骤
同样的,首先来看下面这张图:
接着来看测量,下面是具体的源码跟踪:
查看FrameLayout的onMesure()方法,因为DecorView是继承自FrameLayout:
布局:
、
绘制:
最后是测量布局绘制整个的流程总结:
OK,这篇笔记就到这里了!