如果说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 控件架构的更多相关文章

  1. Android 控件架构及View、ViewGroup的测量

    附录:示例代码地址 控件在Android开发的过程中是必不可少的,无论是我们在使用系统控件还是自定义的控件.下面我们将讲解一下Android的控件架构,以及如何实现自定义控件. 1.Android控件 ...

  2. Android群英传笔记——第三章:Android控件架构与自定义控件讲解

    Android群英传笔记--第三章:Android控件架构与自定义控件讲解 真的很久没有更新博客了,三四天了吧,搬家干嘛的,心累,事件又很紧,抽时间把第三章大致的看完了,当然,我还是有一点View的基 ...

  3. Android 控件架构与自定义控件详解

    架构: PhoneWindow 将一个 DecorView 设置为整个应用窗口的根 View,这里面所有 View 的监听事件,都通过 WindowManagerService 来接收.DecorVi ...

  4. 《Android群英传》读书笔记 (2) 第三章 控件架构与自定义控件详解 + 第四章 ListView使用技巧 + 第五章 Scroll分析

    第三章 Android控件架构与自定义控件详解 1.Android控件架构下图是UI界面架构图,每个Activity都有一个Window对象,通常是由PhoneWindow类来实现的.PhoneWin ...

  5. 第二章 控件架构与自定义控件详解 + ListView使用技巧 + Scroll分析

    1.Android控件架构下图是UI界面架构图,每个Activity都有一个Window对象,通常是由PhoneWindow类来实现的.PhoneWindow将DecorView作为整个应用窗口的根V ...

  6. Android视图控件架构分析之View、ViewGroup

    在Android中,视图控件大致被分为两类,即ViewGroup和View,ViewGroup控件作为父控件,包含并管理着子View,通过ViewGroup和View便形成了控件树,各个ViewGou ...

  7. [Android Pro] android控件ListView顶部或者底部也显示分割线

    reference to  :  http://blog.csdn.net/lovexieyuan520/article/details/50846569 在默认的Android控件ListView在 ...

  8. Android控件Gridview实现仿支付宝首页,Fragment底部按钮切换和登录圆形头像

    此案例主要讲的是Android控件Gridview(九宫格)完美实现仿支付宝首页,包含添加和删除功能:Fragment底部按钮切换的效果,包含四个模块,登录页面圆形头像等,一个小项目的初始布局. 效果 ...

  9. Android - 控件android:ems属性

    Android - 控件android:ems属性http://blog.csdn.net/caroline_wendy/article/details/41684255?utm_source=tui ...

随机推荐

  1. 0601 Spring2.0 发布会及产品发展方向

    ProductBacklog:继续向下细化; 1.界面美化,统一界面风格,以简洁美观为主: 2.丰富版面的内容,吸引用户: 3.尝试增加新的版面: Sprint 计划会议:确定此次冲刺要完成的目标 1 ...

  2. 判断 0 和 '' 以及 empty null false的关系

    if('safdasefasefasf'==0) { echo "该字符串转换为数字 等于 0 <br/>"; } //output:该字符串转换为数字 等于零. 这是 ...

  3. Java获取系统时间

    Java可以通过SimpleDateFormat格式化类对Date进行格式话获取时间. import java.util.*; import java.text.*; public class Tes ...

  4. linux C学习笔记03--单链表

    单链表一直是程序员的基础,我也来复习下,下面是link.c中的代码,供main.c 调用,代码很简单,单链表的插入,删除,查找和遍历输出, #include <stdio.h> #incl ...

  5. 先进先出集合queue

    先进先出集合queue Enqueue添加到集合最后 Dequeue移除集合第一个对象并返回

  6. 【C#】 一些不常用,很容易混淆的知识点

    [C#] 一些不常用但很容易混淆的知识点 1. 访问修饰符 internal ,译为内部的, 在同一个程序集中可访问,它的内部是相对与程序集的,可不能想当然了 2. String.Compare 这个 ...

  7. 在Linux中的文本模式下手动安装 Parallels Tools

    1.启动虚拟机. 2.当看到提示 X Server 无法启动的消息时,使用 Ctrl+Option+F1(Ctrl+Alt+F1)切换到另一个虚拟控制台并输入登录信息. 3 从“虚拟机”菜单中选择“安 ...

  8. IDE警告信息不应该被忽略

    当ide进行编译时提示有变量未使用 可能意味着变量使用错误 因为我们没理由创建一个变量却不去使用他 如if语句判断一个int 或者日期 等其他非空类型是否为null 总是true 这意味这我们在逻辑处 ...

  9. python-->基础-->002-->input & raw_input

    一.input与raw_input的区别 1.raw_input()说明 a = raw_input("input content:")print a,type(a) 输出结果: ...

  10. 柬埔寨手机上网资费套餐(3G/4G上网)

    柬埔寨三大运营商 Cellcard   官网套餐详情http://www.cellcard.com.kh/cellcard-internet Metfone  官网套餐详情http://www.met ...