您的位置:首页 > 运维架构 > 网站架构

Android 视图架构学习笔记

2016-09-09 01:15 387 查看
Android 视图架构学习笔记








Activity的Touch事件事实上是调用它内部的Window的ViewGroup的Touch事件,可以直接当成ViewGroup处理。(这就是为什么在activity中有onTouchEvent())


Activity和Window

 Activity并不负责视图控制,它只是控制生命周期和处理事件,真正控制视图的是Window。一个Activity包含了一个Window,Window才是真正代表一个窗口,也就是说Activity可以没有Window,那就相当于是Service了。在ActivityThread中也有控制Service的相关函数或许正好印证了这一点。

 Activity的setContentView实际上是调用了Window的setContentView方法。

 Window通过installDecor来新建DecorView。



Window,Activity和DecorView

 DecorView是FrameLayout的子类,它可以被认为是Android视图树的根节点视图。DecorView作为顶级View,一般情况下它内部包含一个竖直方向的LinearLayout,在这个LinearLayout里面有上下两个部分(具体情况和Android版本及主体有关),上面的是标题栏,下面的是内容栏。在Activity中通过setContentView所设置的布局文件其实就是被加到内容栏之中的,而内容栏的id是content,在代码中可以通过ViewGroup
content = (ViewGroup)findViewById(R.android.id.content)来得到content对应的layout。
 Window中有几个视图相关的比较重要的成员变量如下所示:
 
mDecor:DecorView的实例,标示Window内部的顶级视图
mContentParent:setContetView所设置的布局文件就加到这个视图中
mContentRoot:是DecorView的唯一子视图,内部包含mContentParent,标题栏和状态栏。


Window,DecorView 和 ViewRoot

ViewRoot对应ViewRootImpl类,它是连接WindowManagerService和DecorView的纽带,View的三大流程(测量(measure),布局(layout),绘制(draw))均通过ViewRoot来完成。ViewRoot并不属于View树的一份子。从源码实现上来看,它既非View的子类,也非View的父类,但是,它实现了ViewParent接口,这让它可以作为View的名义上的父视图。RootView继承了Handler类,可以接收事件并分发,Android的所有触屏事件、按键事件、界面刷新等事件都是通过ViewRoot进行分发的。ViewRoot可以被理解为“View树的管理者”——它有一个mView成员变量,它指向的对象和上文中Window和Activity的mDecor指向的对象是同一个对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: