window、view相关

View、Window以及Activity主要是用于显示并与用户交互
window view activity surfaceView

三者间的关系:
在Activity中要设置View时,通常用的方法是:setContentView(id);
而实际在Activity类中用的是:getWindow().setContentView(id);
此即view是放到window上的,获得window的方法是:activity.this.getWindow();
Activity实际上是继承 Context类
window是在Activity的 attach() 方法中实例化的: window = new PhoneWindow(this, window);

attach 优先于 onCreate 调用
即:activity调用attach创建window(PhoneWindow)对象,在activity中调用setContentView()向window中添加view PhoneWindow
实际上是在PhoneWindow 中的setContentView()方法中向ViewGroup(root)中添加view

dialog Toast都是在window上显示的

window代表一块可绘制显示的区域,系统给window提供可绘制图形的surface对象,而不管如何绘制;
window是为了管理view,为每个view提供canvas,去绘制.

Activity相当于一个界面,可直接在Activity里处理事件,Activity初始化时得到一个window对象,window用于管理view,view即实际显示到界面上的图形...

View绘制流程: view树结构
onMeasure() --> onLayout() --> onDraw()
measure:测量组件大小 layout:确定组件在视图中的位置 draw:根据位置和大小画组件
视图绘制的起点在ViewRootImpl类的performTraversals()方法,该方法完成的工作主要是:
根据之前的状态,判定是否重新计算测试视图大小(measure)、是否重新放置视图位置(layout)和是否重新重绘视图(draw)

setContentView流程
setContentView整个过程主要是把Activity的布局文件或者java的View添加至窗口里,重点概括为:
创建一个DecorView的对象mDecor,该mDecor对象将作为整个应用窗口的根视图。
依据Feature等style theme创建不同的窗口修饰布局文件,并且通过findViewById获取Activity布局文件该存放的地方(窗口修饰布局文件中id为content的FrameLayout)。
将Activity的布局文件添加至id为content的FrameLayout内。
当setContentView设置显示OK以后会回调Activity的onContentChanged方法。Activity的各种View的findViewById()方法等都可以放到该方法中,系统会帮忙回调。

ViewRoot是连接WindowManager与DecorView的纽带,View的整个绘制流程的三大步(measure、layout、draw)都是通过ViewRoot完成的。
当Activity对象被创建完毕后,会将DecorView添加到Window中(Window是对窗口的抽象,DecorView是一个窗口的顶级容器View,其本质是一个FrameLayout),
同时会创建ViewRootImpl(ViewRoot的实现类)对象,并将ViewRootImpl与DecorView建立关联。关于ViewRoot,我们只需要知道它是联系GUI管理系统和GUI呈现系统的纽带。
View的绘制流程从ViewRoot的performTraversals方法开始,经过measure、layout、draw三大过程完成对一个View的绘制工作。

peformTraversal方法内部会调用measure、layout、draw这三个方法,这三个方法内部又分别调用onMeasure、onLayout、onDraw方法。
ViewRoot对应于ViewRootImpl类,它是连接WindowManager和DecorView的纽带,View的三大流程是通过VeiwRoot来完成的。在ActivityThread中,
当Activity对象被创建完毕后,会将DecorVeiw添加到Window中,同时会创建ViewRootImpl对象,并将ViewRootImpl对象和DecorView建立关联。

Activity内部有个Window成员,它的实例为PhoneWindow,PhoneWindow有个内部类是DecorView,这个DecorView就是存放布局文件的,
里面有TitleActionBar[TitleView(ActionBar的容器)]和我们setContentView传入进去的layout布局文件

使用View的getMeasuredWidth()和getMeasuredHeight()方法来获取View测量的宽高,
必须保证这两个方法在onMeasure流程之后被调用才能返回有效值。
使用View的getWidth()和getHeight()方法来获取View测量的宽高,必须保证这两个方法在onLayout流程之后被调用才能返回有效值。

onDraw:
区分View动画和ViewGroup布局动画,前者指的是View自身的动画,可以通过setAnimation添加,
后者是专门针对ViewGroup显示内部子视图时设置的动画,可以在xml布局文件中对ViewGroup设置layoutAnimation属性
(譬如对LinearLayout设置子View在显示时出现逐行、随机、下等显示等不同动画效果)。

invalidate和postInvalidate方法:
请求重新绘制视图,调用draw
invalidate在主线程调用
postInvalidate是在非主线程调用

View的requestLayout方法:
requestLayout()方法会调用measure过程和layout过程,不会调用draw过程,也不会重新绘制任何View包括该调用者本身。

viewRoot DecorView
ViewRoot实际是一个Handler,ViewRoot建立主View与WindowsManger通讯的桥梁。ViewRoot在本质上一个Handler。
ViewRoot 对应于ViewRootImpl类,View的三大流程都是通过ViewRoot来完成的。在ActivityThread中,当Activity对象被创建完毕之后,
会将DecorView添加到Window中,同时会创建ViewRootImpl对象,并将ViewRootImpl对象和DecorView建立关联。

DecorView作为顶级View,一般情况下它内部会包含一个竖直方向的LinearLayout,在这个LinearLayout里面有上下两个部分,
上面是标题栏,下面是内容栏。DecorView其实是一个Framglayout,View层的事件都先经过DecorView,然后才传递给我们的View。

Window: 表示一个窗口,不一定有屏幕那么大,可以很大也可以很小;
它包含一个View tree和窗口的layout 参数。
View tree的root View可以通过getDecorView得到。还可以设置Window的Content View。

WindowManager并不是整个系统的窗口管理器,而是所在应用进程的窗口管理器。
系统全局的窗口管理器运行在SystemServer进程中,是一个Service。

每个窗口对应着一个Window对象,一个根View和一个ViewRoot对象。要想创建一个窗口,可以调用
WindowManager的addView方法,作为参数的view将作为在该窗口上显示的根view

window里显示的东西是view(activity是逻辑上的东 西,增加了生命周期管理等. 里面具体的东西也是view。
而且启动activity的实现也是往window里加view),往window里加view,是通过调用 WindowManager(WindowManagerImpl).addView()来实现的。

在 addView里,会为每个view创建一个viewRoot(这是逻辑上的东西,用来负责view的事件处理和逻辑处理,
并和 WindowsManagerService建立联系),而在WindowManagerImpl里,会维护viewRoot的数组。
最终会调用ViewRoot.setView(),在setView里会显示该view等。在setView的实现里,会调用Session.add()来 addWindow,通过这个方法,
会将ViewRoot和WindowManagerService联系起来(比如说分发事件等),并且这个方法里会调 用PhoneWindowManager.prepareAddWindowLw()。

时间: 2024-08-04 19:18:39

window、view相关的相关文章

数据库——视图(View)相关

数据库——视图(View)相关 1. 综述 相关博客:http://www.cnblogs.com/pony/archive/2008/07/15/1243210.html(数据库视图介绍) 视图有 可插入的(insert) 和 可更新的(update) . 插入限制: 1. 视图中不包含原表中不能为空的列时,不能插入.因为视图会试图插入空值: 2. 视图中包含统计函数的结果 (如MAX()最大值),或者包含计算列,不能插入; 3. 使用了distinct.group by语句的视图,不能插入.

ViewModel处理View相关事件的多种方式(非技术贴,仅学习总结)

众所周知,在UWP中,微软为我们提供了一种新的绑定方式:x:bind,它是基于编译时的绑定.在性能方面,运行时绑定Binding与它相比还是有些逊色的.因此针对一些确定的.不需要变更的数据,我们完全有理由来使用X:bind进行绑定.(当然,如果你不在乎程序性能的话就没必要继续往下看了!) 悉MVVM的朋友都知道,我们常常遇到这样一种情况:我们需要为一个控件绑定一个ViewModel中的Command,但是这个控件并没有Command属性?笼统的解决方法有很多,我这里大致列举几种常用的解决方法:

【Unity】12.2 通过Lighting Window设置相关参数

分类:Unity.C#.VS2015 创建日期:2016-05-19 一.简介 Unity 5.3.4的Lighting Window有3个选项卡:Object.Scene.Lightmaps. 二.Object(对象选项卡) 利用该选项卡,可以在场景中选择对象的子集并更改其设置,即选择哪些对象应该参与 GI 计算.这些选项设置将会始终应用于你选择的对象组. 1.All 选项卡的顶部是一组场景筛选按钮,即在层次视图中显示哪些类型 ︰ 灯光,渲染,地形.选择[All]将显示所有类型.如果选择其他按

window 下相关命令

1. 启动window服务(各种应用启动设置的地方)命令方式: 1). window 按钮(输入CMD的地方)处输入:services.msc ,然后执行. 2). 计算机 -- 右键 -- 管理 -- 服务和应用程序 -- 服务 2. DOS 命令下清理当前窗口命令:cls 3. 打开记事本命令:notepad 4. 查看本地相关启动端口命令:netstat -a 5. 启动window远程客户端命令:mstsc          // Microsoft terminal services 

activity window view 关系

1.Activity , Window和View的关系是什么? 跟踪Activity的源码就会发现:Activity.attch() -> PolicyManager -> Policy -> PhoneWindow -> mLayoutInflater.inflate()&mContentParent.addView()这只是一个简单的跟踪过程描述.通过跟踪源代码,就可以很清晰的看出他们三者的关系. Activity像一个工匠(控制单元),Window像窗户(承载模型),

android中activity,window,view之间的关系

activity:控制单元 window:承载模型 view:显示视图 几个小tip: 1.一个 Activity 构造的时候一定会构造一个 Window(PhoneWindow),并且只有一个 2.每个window有一个 ViewRoot(是一个View或ViewGroup) 3.通过window的addview方法把元素添加到window上. 4.可以通过 LayoutInflater 的 inflater 方法,可以把一个布局文件转换成view对象 5.界面上的点击等操作是由 Window

Android中Activity Window View ViewGroup之间的关系

Activity:是Android四大组件之一,用于展示一个与用户交互的界面 ----展示界面 ----与用户交互 Activity相当于控制器,负责调用业务类的方法.简单的业务可以直接在Activity中处理. Activity通过内置是Window对象的setContentView(资源位置.资源类型.资源)方法来展示界面. 用户通过View操作界面. 与用户交互时,通过View来捕获事件,再通过WindowManagerService传递消息(当前操作的控件,事件的类型).Android框

Activity,Window,View之间是什么关系?

Activity在onCreate之前调用attach方法,在attach方法中会创建window对象.window对象创建时并没有创建 Decor对象对象.用户在Activity中调用setContentView,然后调用window的setContentView,这时会检查 DecorView是否存在,如果不存在则创建DecorView对象,然后把用户自己的View 添加到DecorView中.

spring mvc view 相关

由于前段时间一直在成都出差加上心情比较乱,很长时间没有更新博客. 最近一个人负责的成都项目进展比较顺利,基本只剩下一些故障单的修复,所以压力不是很大,所以近段时间就是解决一下故障单,然后剩下的就是为主体项目4.0部分前端资源如何整合进行学习和思考,初步打算是使用requireJS,AMD标准的JS模块化还是比较适合前台的加载,这些容后续再表. 一直对框架上对模版的加载比较好奇,所以今天就看了下部分源码,以下内容如有理解不当或者错误,欢迎指正. java web容器,由服务器向浏览器客户端写回页面