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()。
window、view相关的更多相关文章
- Android View相关知识问答
Android View相关核心知识问答 Activity Window View之间的三角关系 你真的了解View的坐标吗? 在渲染前获取 View 的宽高 5种手势工具类 浅析Android的窗口
- Activity Window View的关系
http://blog.csdn.net/chiuan/article/details/7062215 http://blog.163.com/fenglang_2006/blog/static/13 ...
- android 中的 window,view,activity具体关系
通过讨论这个问题,我们能够见识到google是对面向对象模式的理解,能够理解android底层的一些调用.这也是一道很常见的面试题. 我们这篇文章就来解决这四个问题: Android 中view的显 ...
- PyQt学习随笔:Qt中Model/View相关的主要类及继承关系
View相关类类继承关系: Model相关类类继承关系:
- Activity Window View WindowManager关系&Touch事件分发机制
http://www.cnblogs.com/linjzong/p/4191891.html https://www.cnblogs.com/kest/p/5141817.html https://b ...
- 【Unity】13.2 通过Lighting Window设置相关参数
分类:Unity.C#.VS2015 创建日期:2016-05-19 一.简介 Unity 5.3.4的Lighting Window有3个选项卡:Object.Scene.Lightmaps. 二. ...
- Activity,Window,View之间是什么关系?
Activity在onCreate之前调用attach方法,在attach方法中会创建window对象.window对象创建时并没有创建 Decor对象对象.用户在Activity中调用setCont ...
- ViewModel处理View相关事件的多种方式(非技术贴,仅学习总结)
众所周知,在UWP中,微软为我们提供了一种新的绑定方式:x:bind,它是基于编译时的绑定.在性能方面,运行时绑定Binding与它相比还是有些逊色的.因此针对一些确定的.不需要变更的数据,我们完全有 ...
- activity window view 关系
1.Activity , Window和View的关系是什么? 跟踪Activity的源码就会发现:Activity.attch() -> PolicyManager -> Policy ...
随机推荐
- NetCore+MySql+EF 数据库生成实体模型
NetCore版本 2.1 1.点击“工具”->“NuGet包管理器”->“程序包管理器控制台” 分别安装以下几个包 Mysql 版本: MySql.Data.EntityFrame ...
- nodejs 开启http服务器
1.首先安装node.js windows地址:https://nodejs.org/dist/v10.15.3/node-v10.15.3-x64.msi 配置成功的标志: 若没成功,也有可能是没有 ...
- Integer 函数传参实现值交换
import java.lang.reflect.Field; public class MainClass { public static void main(String[] args) { In ...
- Dockerfile的alpine时区设置
FROM *** RUN apk add -U tzdataRUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
- Struts2源码解析2
看了前面一节对Struts2各个模块运行有了大概了解,也对调用的函数有了一定的了解,本节希望打断点跑一个Struts2例子! 还是放在struts2结构图: 一:项目启动后解析web.xml文件,会解 ...
- freeze
当我们开发项目的时候,会用virtualenv创建很多python独立环境这时候会出现在不同环境下安装相同的模块的情况,为了避免我们通过联网所需模块,不如我们直接从之前Python环境已有的模块中直接 ...
- 一篇文章说清楚mysql索引
索引是什么? 索引是为了加速对表中数据行的检索而创建的一种分散的数据存储结构 为什么要使用索引? 索引能极大的减少数据存储引擎需要需要扫描的数据量: 索引能够把随机IO变为数序IO: 索引能够帮助我们 ...
- FPGA做正则匹配和网络安全,究竟有多大的优势?
FPGA做正则匹配和网络安全,究竟有多大的优势? 西电通院专用集成电路课程学习 云导播 网络安全已经被提升为国家战略的高度,高校里面的新增的一级学科,去年9月份,中央网信办.教育部公布了“一流网络安全 ...
- 设计模式学习心得<外观模式 Facade>
外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 这种模式涉及 ...
- oo第12次作业
一.规格化设计发展历史 在上世纪60年代,由于程序猿们难以忍受超级难懂的机器语言和稍微好懂一点点的汇编语言,便发明了结构化的程序语言,使得程序猿们能愉快地编写复杂程度适中的程序.但是需求是在不断增长的 ...