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()方法。
View的相关原理(读书笔记)的更多相关文章
- <<操作系统精髓与设计原理>>读书笔记(一) 并发性:互斥与同步(1)
<<操作系统精髓与设计原理>>读书笔记(一) 并发性:互斥与同步 并发问题是所有问题的基础,也是操作系统设计的基础.并发包括很多设计问题,其中有进程间通信,资源共享与竞争,多个 ...
- 深入探索Android热修复技术原理读书笔记 —— 代码热修复技术
在前一篇文章 深入探索Android热修复技术原理读书笔记 -- 热修复技术介绍中,对热修复技术进行了介绍,下面将详细介绍其中的代码修复技术. 1 底层热替换原理 在各种 Android 热修复方案中 ...
- 深入探索Android热修复技术原理读书笔记 —— 资源热修复技术
该系列文章: 深入探索Android热修复技术原理读书笔记 -- 热修复技术介绍 深入探索Android热修复技术原理读书笔记 -- 代码热修复技术 1 普遍的实现方式 Android资源的热修复,就 ...
- 深入探索Android热修复技术原理读书笔记 —— 热修复技术介绍
1.1 什么是热修复 对于广大的移动开发者而言,发版更新是最为寻常不过的事了.然而,如果你 发现刚发出去的包有紧急的BUG需要修复,那你就必须需要经过下面这样的流程: 这就是传统的更新流程,步骤十分繁 ...
- 深入探索Android热修复技术原理读书笔记 —— so库热修复技术
热修复系列文章: 深入探索Android热修复技术原理读书笔记 -- 热修复技术介绍 深入探索Android热修复技术原理读书笔记 -- 代码热修复技术 深入探索Android热修复技术原理读书笔记 ...
- LOMA280保险原理读书笔记
LOMA是国际金融保险管理学院(Life Office Management Association)的英文简称.国际金融保险管理学院是一个保险和金融服务机构的国际组织,它的创建目的是为了促进信息交流 ...
- Spark基本工作流程及YARN cluster模式原理(读书笔记)
Spark基本工作流程及YARN cluster模式原理 转载请注明出处:http://www.cnblogs.com/BYRans/ Spark基本工作流程 相关术语解释 Spark应用程序相关的几 ...
- android BSP与硬件相关子系统读书笔记(1)android BSP移植综述
从linux驱动转行至Android驱动开发大半年了,一开始就产生了一个很纠结目标和问题,就是不停的google如何porting android!这个问题得到的结果对于初出茅庐的我,感到迷惘.随着工 ...
- 通信原理读书笔记:常规AM调制的功率
Proakis,通信系统原理,p101: 两个不同频率正弦和的功率为其功率的和. 计算功率时,和的平方展开后会出现两个正弦乘积项,按积化和差展开后在公共周期内积分为零.
随机推荐
- 矩形覆盖(JAVA)
矩形覆盖 题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 思路:最初看到这题,只能通过画图归纳来寻找规律. ...
- JS制作图片切换
<!DOCTYPE html> <html> <head> <title>纯JS制作简单的图片切换</title> <meta cha ...
- 两台Linux服务器之间复制文件
一.scp 1.简介 scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的 2.软件安装 ...
- 解决腾讯云封锁SS(shadow--socks)访问google问题
腾讯云windows主机,若使用SS(shadow--socks)采用加密算法aes-256-cfb,访问google的时候会被dropped connection. 解决办法更改ss server加 ...
- 如何开发一款html5(H5)跨平台 k12动画/交互课件/游戏
flash交互课件能生动表达教学内容,也深受广大教育工作者的喜爱,但是目前flash课件只能在pc电脑平台上进行展示,且目前苹果公司已经不再支持flash各类产品,也就是后续苹果ios pc系统也已经 ...
- FBI树-数据结构(二叉树)
问题 B: [2004_p4]FBI树-数据结构 时间限制: 1 Sec 内存限制: 125 MB提交: 57 解决: 46 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称 ...
- leetcode70 爬楼梯 Python
组合数学Fibonacci 例3.4.1 (上楼梯问题)某人欲登上n级楼梯,若每次只能跨一级或两级,问他从地面上到第n级楼梯,共有多少种不同的方法? (解)设上到第n级楼梯的方法数为an.分类统计 ...
- python excel表格操作
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- [数据库]Sql server 数据库的备份和还原____还原数据库提示“介质集有2个介质簇,但只提供了1个。必须提供所有成员”
在对数据库备份与还原的过程中,我遇到一个问题“介质集有2个介质簇,但只提供了1个.必须提供所有成员”,下面详细的介绍一下遇到问题的经过与问题解决的方法! 一.备份与还原遇到的问题描述与解决方法: 前两 ...
- Halcon 17与 c# 混合编程
这篇主要是C#和Halcon的混合编程,在此基础上对按键不同功能的划分,以及图片适应窗口和从本地打开图片. halcon源程序: dev_open_window(0, 0, 512, 512, ' ...