如果说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. java 中小数点的处理

    第一种 BigDecimal bg = new BigDecimal(f); double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleVa ...

  2. Java介绍(重要特点)

    Java语言平台版本 JavaSE标准版本,是JavaME 和Java EE的基础,能够开放基本桌面程序. JavaME 一句话,安卓开发. JavaEE 一句话,网页开发. Java重要特性(跨平台 ...

  3. #error作用

    指令 用途 # 空指令,无任何效果 #include 包含一个源代码文件 #define 定义宏 #undef 取消已定义的宏 #if 如果给定条件为真,则编译下面代码 #ifdef 如果宏已经定义, ...

  4. Devexpress VCL Build v2015 vol 15.2 开始测试

    增加了几个小玩意,与大版本变化根本无法匹配. 具体可以官网了解 https://www.devexpress.com/Subscriptions/New-2015.xml?product=vcl

  5. [简单]docx4j常用方法小结

    http://53873039oycg.iteye.com/blog/2194479?utm_source=tuicool&utm_medium=referral —————————————— ...

  6. Fiddler抓包测试App接口

    Fiddler抓包测试App接口 使用Fiddler对手机App应用进行抓包,可以对App接口进行测试,也可以了解App传输中流量使用及请求响应情况,从而测试数据传输过程中流量使用的是否合理. 抓包过 ...

  7. delphi模拟按键精灵自动控制PDF页面自动扩边的源代码

    需要的环境:Adobe Acrobat 7.0 Professional  和   Quite Imposing Plus 1.5d Acrobat plugin  (qi160.exe) 程序界面: ...

  8. swift 批量 取出中间文本

    func stringmid_pl (wholestring:String,front:String,behind:String,inout return_string:String,getheroi ...

  9. Oracle环境变量NLS_LANG

    常见的值可以参见Oracle Database Client Globalization Support

  10. OpenSSL命令---passwd

    NAME passwd - compute password hashes SYNOPSIS openssl passwd [-crypt] [-1] [-apr1] [-salt string] [ ...