Android 控件架构
如果说Android上的app是一个有血有肉的人的话,那么人靠衣装马靠鞍,那么控件就是把app装扮的漂漂亮亮的“衣服”。那么安卓的控件到底是如何架构,又是如何渲染的了。
无论是什么控件,在Android中控件只有两种,一种就是View,另一种是ViewGroup。ViewGroup控件组,一个控件的百宝箱,可以包含各种各样的控件组,它不仅能够包含控件还能够管理着控件。通过ViewGroup,整个控件就至上而下的形成了树形结构,即我们通常所说的控件树;父控件负责相应子控件的绘制与测量,并向其传递交互事件。安卓系统怎么准确无误的找到每一个控件?只需要调用findViewbyid的方法就能够按照深度优先的方法找到每一个控件了。在每个控件树最顶端,都站立了一个Viewparent对象,这个对象也是这颗控件树的核心,所有的交互管理事件都是由这个大大负责统一分配和调度,从而起这一个整体宏观调控的效果。一个控件树架构如图所示:

做过Android开发都知道,要使一个activity显示相应的布局文件,都必须要setContentView。我们要看一下setContentView背后到底发生了什么,Android又是如何将其渲染出来的了。要解答这些问题,我们还是要了解Android的界面架构图。具体的架构图如图所示:

通过上图所示,我们可以得出这样的结论。
①每个activity都有一个window对象。
②而每一个window对象通常是由PhoneWindow来实现。
③每个PhoneWindow对象包含DecorView这个根视图对象,将其视图展示都是通过这个对象显示到PhoneWindow上。
④而DecorView被一分为二,一个是TitleView,一个ContentView,TitleView显示相应的标题,ContentView显示具体布局,这些应该大家很熟悉。
这样架构也可以建立一个上文提到的视图树,这颗视图树长成这个样子:

这样控件树,能够帮我们解答这样一个问题为什么requestWindowFeature()一定要在setContentView之前调用才能起效。这是由于TitleBar下面才是ContentView,在ContentView之后设置,这时,只能有ContentView。当程序在oncreate方法调用setcontentView后会调用onResume方法,此时系统会把整个DecorView添加到PhoneWindow中,最终将视图显示出来。
Android 控件架构的更多相关文章
- Android 控件架构及View、ViewGroup的测量
附录:示例代码地址 控件在Android开发的过程中是必不可少的,无论是我们在使用系统控件还是自定义的控件.下面我们将讲解一下Android的控件架构,以及如何实现自定义控件. 1.Android控件 ...
- Android群英传笔记——第三章:Android控件架构与自定义控件讲解
Android群英传笔记--第三章:Android控件架构与自定义控件讲解 真的很久没有更新博客了,三四天了吧,搬家干嘛的,心累,事件又很紧,抽时间把第三章大致的看完了,当然,我还是有一点View的基 ...
- Android 控件架构与自定义控件详解
架构: PhoneWindow 将一个 DecorView 设置为整个应用窗口的根 View,这里面所有 View 的监听事件,都通过 WindowManagerService 来接收.DecorVi ...
- 《Android群英传》读书笔记 (2) 第三章 控件架构与自定义控件详解 + 第四章 ListView使用技巧 + 第五章 Scroll分析
第三章 Android控件架构与自定义控件详解 1.Android控件架构下图是UI界面架构图,每个Activity都有一个Window对象,通常是由PhoneWindow类来实现的.PhoneWin ...
- 第二章 控件架构与自定义控件详解 + ListView使用技巧 + Scroll分析
1.Android控件架构下图是UI界面架构图,每个Activity都有一个Window对象,通常是由PhoneWindow类来实现的.PhoneWindow将DecorView作为整个应用窗口的根V ...
- Android视图控件架构分析之View、ViewGroup
在Android中,视图控件大致被分为两类,即ViewGroup和View,ViewGroup控件作为父控件,包含并管理着子View,通过ViewGroup和View便形成了控件树,各个ViewGou ...
- [Android Pro] android控件ListView顶部或者底部也显示分割线
reference to : http://blog.csdn.net/lovexieyuan520/article/details/50846569 在默认的Android控件ListView在 ...
- Android控件Gridview实现仿支付宝首页,Fragment底部按钮切换和登录圆形头像
此案例主要讲的是Android控件Gridview(九宫格)完美实现仿支付宝首页,包含添加和删除功能:Fragment底部按钮切换的效果,包含四个模块,登录页面圆形头像等,一个小项目的初始布局. 效果 ...
- Android - 控件android:ems属性
Android - 控件android:ems属性http://blog.csdn.net/caroline_wendy/article/details/41684255?utm_source=tui ...
随机推荐
- HTML中常用meta整理
< meta > 元素 定义 meta标签提供关于HTML文档的元数据.元数据不会显示在页面上,但是对于机器是可读的.它可用于浏览器(如何显示内容或重新加载页面),搜索引擎(关键词),或其 ...
- mybatis关联查询,一对一,一对多
注:这篇文章的代码有部分删减,不能直接使用,不过关键代码都存在 应用场景: 想用mybatis做关联查询,并且把查询出的数据自动组装成对象可以使用关联查询. 1.一对一实现 例如:一部小说,属于一个 ...
- 怎么去除google的 安全搜索
想要避开安全搜索 更改右上角的搜索设置,将搜索语言改为英文,然后保存搜索设置 第二次进入搜索设置里找Filter explicit results前的面的勾去掉即可.
- WebStorage 和 Cookie的区别
sessionStorage 和 localStorage 是HTML5 Web Storage API 提供的,可以方便的在web请求之间保存数据.有了本地数据,就可以避免数据在浏览器和服务器间不必 ...
- win8系统安装xampp后apache无法启动
根据提示判断为端口被占用: 处理方法: 右击左下角windows图标,选择运行,调了同cmd; 依次排除80及443端口占用情况: netstat -ano|findstr "80" ...
- XproerIM-V1,2,12,65475发布。
下载地址:http://yunpan.cn/QTCxKvcpC4Iet 访问密码 9141更新记录:1.登陆面板增加帐号列表功能.
- flex 导出Excel功能实现
方法一: 1.Excel导出主要代码: try { var bytes: ByteArray = new ByteArray(); bytes.writeMultiByte(DataG ...
- 通过反射向将EF的实体映射配置加入到实体模型中
public AdminDbContext() : base("MemberDbContext") { //不使用代理创建导航属性,避免WCF序列化错误 Configuration ...
- 单片机中断的IE和IP寄存器(摘抄)
收藏 评论(0) 分享到 微博 QQ 微信 LinkedIn 一.中断允许寄存器IE CPU对中断源的开放或中断屏蔽的控制是通过中断允许寄存器IE设置的,IE既可按字节地址寻址(其字节地址为A8 ...
- Swift 为你的webView定制标题
有些情况下,应用中会使用webView来加载大段的文字,而且还是带各种标签的. 不能全部过滤掉,那样的话,内容就会失去原本想表达的格式. 可是,如果webView中并没有将内容的标题或其他杂项包含进那 ...