View的相关原理(读书笔记)

View的使用方法相关:

1.setContentView()

2.LayoutInflater.inflate()

PS:本质上setContentView()方法最终也是通过LayoutInflater来操作View的

LayoutInflater的工作方式:

1.LayoutInflater是用过xmlPullParser来读取XML文件里的布局的

2.读取布局后,通过rInflate(paser,root,attrs)方法来读取View,然后返回

3.rInflate方法先调用createViewFromTag(name,attrs)方法,然后createViewFromTag()内部再调用createView()方法,以反射的方式进行新建对象并返回

4.当第三步执行完后,将第三步返回的View对象作为参数,重复调用rInflate()方法,层层递归,遍历每个View里面的子元素,返回给父View

inflate还存在另一个方法:inflate(int resource, ViewGroup root, boolean attachToRoot)

此方法表示是否将resource对应的视图添加进root的方法。

如果root为null,那么在resource对应的视图里面对应的子元素通过inflate显示的时候,子元素的布局信息会失去效果,因为子元素的布局设置都是相对父布局而言的。

基于这种子元素布局必须依赖父容器来设置的思想,会产生一个悖论,根布局的设置match_parent是有效的,但我们没有给他们设置父布局,这是为什么呢?

简单考虑,我们设置的任何View都需要一个容器去承载,而我们又不能每次都自己设置根布局,于是Android系统帮我们解决了这一问题:

系统帮我们默认建立了一个Framelayout用于承载所有的View元素,这一切都是默认的。

手机界面生呈现出来的界面经过了层层绘制的具体可参照:http://www.cnblogs.com/beenupper/archive/2012/07/13/2589749.html

View的绘制过程:

step 1:Measure()

  measure()方法会接收两个参数widthMeasureSpec和heightMeasureSpec,这两个值分别用于确定视图的宽度和高度的规格和大小。

  MeasureSpec的值由specSize和specMode共同组成的,其中specSize记录的是大小,specMode记录的是规格。

  specMode的三种模式:

  1. EXACTLY

  表示父视图希望子视图的大小应该是由specSize的值来决定的,系统默认会按照这个规则来设置子视图的大小,开发人员当然也可以按照自己的意愿  设置成任意的大小。

  2. AT_MOST

  表示子视图最多只能是specSize中指定的大小,开发人员应该尽可能小得去设置这个视图,并且保证不会超过specSize。系统默认会按照这个规则来设置子视图的大小,开发人员当然也可以按照自己的意愿设置成任意的大小。

  3. UNSPECIFIED

  表示开发人员可以将视图按照自己的意愿设置成任意的大小,没有任何限制。这种情况比较少见,不太会用到。

  而MeasureSpec的值是在performTraversals()方法中,通过调用getRootMeasureSpec()方法获取的,

真正来执行Measure的程序段:onMeasure()

  (这也是我们能够通过重写该方法自定义View的渠道),该方法默认调用getDefaultSize()方法来获取视图的大小,这个默认方法就是用来识别match_parent和wrap_content设置的。

  我们可以通过在自定义的View中重写onMeasure()方法来覆盖默认的getDefaultSize()方法,让自定义的视图完全按照我们的设计大小绘制

  在我们完成了对自定义视图的设置后,ViewGroup会通过measureChild()方法来解析MeasureSpec,测量具体的大小。

总结:

  视图大小的控制是由父视图、布局文件、以及视图本身共同完成的,父视图会提供给子视图参考的大小,而开发人员可以在XML文件中指定视图的大小,然后视图本身会对最终的大小进行最终决定。

step 2:Layout()

  在完成Measure()之后视图的大小就测量好了,接下来就是确定该视图处于父容器的具体位置,ViewRoot的performTraversals()方法会在measure结束后继续执行,并调用View的layout()方法来执行此过程。

  在Layout方法中会先检测位置信息是否发生改变,然后调用onLayout()方法,但这个onLayout()方法在View中是空的,需要追溯到ViewGroup中,而ViewGroup方法中的代码为:

@override

protected abstract void onLayout(boolean changed, int l, int t, int r, int b);

这就意味着需要控制位置信息,必须要自己重写方法。

  

step 3:Draw()

  在以上步骤都完成后,ViewRoot中的代码会继续执行并创建出一个Canvas对象,然后调用View的draw()方法来执行具体的绘制工作

 在Draw()方法中的关键步骤:

  step 1: 绘制backgroud的相关属性,可以是设置的颜色和drawable引用

  step 2: if (!dirtyOpaque) onDraw(canvas);  这里就是执行我们重写的onDraw()方法

  step 3: dispatchDraw(canvas);    绘制子视图

  step 4: onDrawScrollBars(canvas);    绘制draw decorations (scrollbars)

而我们最常操作的就是第三步,重写onDraw()方法。

时间: 2024-11-01 18:16:02

View的相关原理(读书笔记)的相关文章

<<操作系统精髓与设计原理>>读书笔记(一) 并发性:互斥与同步(1)

<<操作系统精髓与设计原理>>读书笔记(一) 并发性:互斥与同步 并发问题是所有问题的基础,也是操作系统设计的基础.并发包括很多设计问题,其中有进程间通信,资源共享与竞争,多个进程活动的同步以及分配给进程的处理器时间的. 和并发相关的关键术语:原子操作: 一个或多个指令的序列,对外是不可分的:即没有其他进程可以看到其中间状态或者中断此操作. 并发中,为了确保并发下的数据完整性,我们有一系列的同步方法,其实这些就是为了实现互斥性!对临界区程序的互斥性.有三种方法: 1.软件方法,但是

android BSP与硬件相关子系统读书笔记(1)android BSP移植综述

从linux驱动转行至Android驱动开发大半年了,一开始就产生了一个很纠结目标和问题,就是不停的google如何porting android!这个问题得到的结果对于初出茅庐的我,感到迷惘.随着工作的需要,自己的经验也就慢慢的增加,这些迷雾也慢慢解开,这里要多谢我自己的努力和老大高工的精心栽培. 言归正传,将android移植到特定硬件平台上,其核心是bsp的搭建工作,bsp是板级支持包,并不是特定某个文件,而是从功能上理解的一种硬件适配软件包,它的核心就是: 1. linux内核硬件相关部

通信原理读书笔记:幅度调制

1. SSB 1.1 使用滤波器,这个方法需要极其陡峭的边沿,暂时放一边: 1.2 另一个办法,为了去掉半个边带,我们需要“构造”出一个信号,DSB的频谱与构造信号的频谱加或减后,就能去掉半个边带.根据DSB的频谱和SSB的频谱,不难画出构造信号的频谱.将这个构造信号的频谱和SSB的数学表达式放在一起就好理解了.Oppenh的<信号与系统>有AM相关内容. 2. VSB 上图是VSB发射端滤波器幅频特性,保留上边带,残留下边带.只看正频率部分. DSB的频谱是关于fc左右对称的,占用带宽为[f

逆向工程核心原理读书笔记(1)

工具 OllyDbg免费的win32专业调试工具. IDA Pro收费的专业调试工具,功能强大. 设置"大本营"的四种方法 (1)goto命令快捷键是ctrl+g,目前就会根据地址找来找去,应该还有其他用法. (2)设置断点,快捷键F2.在觉得重要的点设置断点,下次可以直接CTRL+F9运行到断点自动停止. (3)注释,快捷键是;必须是英文的分号. (4)标签,快捷键是:也必须是英文的冒号. 快速查找代码的四种方法 (1)代码执行法 (2)字符串检索法:鼠标右键查找:所有字符串引用.

【游戏设计模式】之四 《游戏编程模式》读书笔记:全书内容梗概总结

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/53240330 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 本文的Github版本:QianMo/Reading-Notes/<游戏编程模式>读书笔记 这是一篇超过万字读书笔记,总结了<游戏编程模式>一书中所有章节与内容的知识梗概. 我们知道,游戏行业其实一直很缺一本系

JavaScript 设计模式与开发实践读书笔记 http://www.open-open.com/lib/view/open1469154727495.html

JavaScript 设计模式与开发实践读书笔记 最近利用碎片时间在 Kindle 上面阅读<JavaScript 设计模式与开发实践读书>这本书,刚开始阅读前两章内容,和大家分享下我觉得可以在项目中用的上的一些笔记. 我的 github 项目会不定时更新,有需要的同学可以移步到我的 github 中去查看源码: https://github.com/lichenbuliren/design-mode-notes 1.currying 函数柯里化 currying 又称 部分求值 .一个 cu

《大型网站技术架构 -核心原理与安全分析》读书笔记

大型网站架构演化的价值观 网站的价值在于它能为用户提供什么价值,在于网站能做什么,而不在于它是怎么做的,所以在网站还很小的时候去追求网站的架构是舍本逐末,得不偿失的.小型网站最需要做的就是为用户提供好的服务来创造价值,得到用户的认可,活下去,野蛮生长. 网站架构设计误区 一味追求大公司的解决方案 大公司的经验和成功模式固然重要,值得学习借鉴,但如果因此而变得盲从,就失去了坚持自我的勇气,在架构演化的道路上迟早会迷路. 为了技术而技术 网站技术是为业务而存在的,除此毫无意义.在技术选型和架构设计中

Understanding Scroll Views 深入理解 scroll view 读书笔记

Understanding Scroll Views 深入理解 scroll view ?读书笔记 ? It may be hard to believe, but a?UIScrollView?isn't much different than a standard?UIView. Sure, the scroll view has a few more methods, but those methods are really just facades of existing UIView

Android学习笔记View的工作原理

自定义View,也可以称为自定义控件,通过自定义View可以使得控件实现各种定制的效果. 实现自定义View,需要掌握View的底层工作原理,比如View的测量过程.布局流程以及绘制流程,除此之外,还需要掌握View常见的回调方法.而对于那些具有滑动效果的自定义View,我们还需要处理View的滑动,如果遇到滑动冲突则需要处理相应的滑动冲突. 下面是View的常见回调方法: 构造方法 onAttach onVisibilityChanged onDetach onFinishInflate on