Android 控件架构view和ViewGroup
Android 控件架构
控件架构,咋一听,很高大上的样子,如果深入去了解其实却是很高大上哈 !! 今天我就简单的写个总结,一方面增强自己的理解。另一方面也可以给不懂的童鞋一个参考哈!若有分析的不对,欢迎指正和拍砖~
控件和控件树是什么鬼
-
控件组成
既然是控件架构,那么必然先要了解控件对吧。Android 的控件大致被分为两大类,即View 和ViewGroup; 扯淡吧 android控件多了去了button、Image、TextView、RelativeLayout...这些都是基于View和ViewGroup系统给我们封装好的一些控件和容器控件。我们自己也可以基于它们实现自己的控件或容器控件。 -
控件树
image
android 的界面是由view和ViewGrop构成的就像下图:
ViewGroup作为父控件可以包含View和ViewGrop,ViewGroup,通过ViewGrop整个界面形成了一个树形结构,这就是我们所说的控件树,上层控件负责下层控件的绘制与测量,并传递交互事件。
image
架构又是什么鬼
这里的架构指的是UI界面架构。简单的讲:Activity本身是没有界面的,它只提供一个窗口,开发人员通过Activity提供的接口setContentView(View)将UI放到Activity所创建的窗口上,这个过程中各个角色组成UI界面架构。
每个Activity都包含一个Window对象,window对象通常由PhoneWindow实现,PhonWindow将DecorView作为整个应用窗口的根View,DevorView将具体要显示的内容呈现在phoneWindow上,在显示上它将屏幕分为了两部分 TitleView 和 ContentView. TitleView就是 actionBar部分,ContentView它是一个ID为content的Framelayout,activity_main.xml就被设置在这样一个Framelayout里面。
细说DecorView
再来仔细探讨下DecorView结构
标准视图树
DecorView的第二层封装一个LinearLayout作为ViewGroup,这一层的布局结构会根据用户设置的参数进行布局,默认的情况是上面TitleBar 下面是ContentView 。但是我们也可以选择全屏模式通过设置requestWindowFeature(Window.FEATURE_NO_TITLEBA)来隐藏titlebar。
当调用SetcontentView()方法后,ActivityManagerService就会调用Onresume()方法将整个DecorView添加到PhoneWindow中去,并让其显示出来,从而完成最终的界面绘制。