Android中View大小的确定过程
View and ViewGroup
安卓中有5种基本的 ViewGroup:
- FrameLayout
- RelativeLayout
- LinearLayout
- TableLayout
- AbsoluteLayout
ViewGroup可以添加子View,在xml文件里面,我们可以这样写:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="100dp" >
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ImageView
android:layout_width="match_parent"
android:layout_height="20dp" />
</RelativeLayout>
子View的大小
LayoutParams
LayoutParams用来描述一个View在父容器中大小,它包括了高度和宽度两个维度的信息,每个维度的数据类型都是int,取值是下面三种情况之一:FILL_PARENT/MATCH_PARENT,
取值是-1.填充满父容器, minus padding.
WRAP_CONTENT,
取值是-2.尺寸尽量小,能包住自身的全部内容就行, plus padding.
一个确定的尺寸,大于等于0的一个数值。
父容器的大小状态
Padding
留白。自身内容的大小加上留白就是父容器的内容的真正大小。
MeasureSpec
当父容器要确定子View的大小的时候,父容器需要告诉子View自身的大小状态。当父容器所属的大小状态不同时,对子View的尺寸约束是不一样的。父容器大小状态有下面三种情况:
parent child UNSPECIFIED 父容器对子View没有任何约束,子View可以按自身需要,任意大小。 EXACTLY 父容器大小是一个确定的数值,子View只能限定在指定大小内。 AT_MOST 父容器本身以及内含的所有子View大小不能超过指定大小。 View的尺寸大小和尺寸状态
尺寸大小的数据类型是
int,
8个字节。尺寸大小和尺寸状态在很多时候需要一起传递,为了减少对象的分配,把三种尺寸状态编码到尺寸大小
int变量的最高位2个位中。UNSPECIFIED+-----------+----------
| 00xx xxxx | 剩余的7个字节. 0x00 << 30 + value
+-----------+----------
EXACTLY+-----------+----------
| 01xx xxxx | 剩余的7个字节. 0x01 << 30 + value
+-----------+----------
AT_MOST+-----------+----------
| 10xx xxxx | 剩余的7个字节. 0x10 << 30 + value
+-----------+----------
子View尺寸的最终确定
子View有一个期望的尺寸大小,父容器有尺寸大小约束,这两方面的约束协调,用来计算View的大小状态。
根据父容器的尺寸状态,以及子View的
LayoutParams,可以确定子View的大小和状态:MeasureSpec,并要求子View确定自身大小。调用子View的
measure()方法,子View的onMeasure()方法也会被执行。子View在
onMeasure()方法中,根据父容器给出的尺寸大小和约束,根据自身情况,确定最终的大小。父容器根据子View的确定的大小,最终确定自身大小。
需要考虑的因素
- 父容器的尺寸状态:
- EXACTLY
- AT_MOST
- UNSPECIFIED
- 父容器的尺寸大小:
parentSize 父容器的留白:
parentPadding父容器真正内容的大小是:
parentSize-parentPadding,
用变量parentContentSize代替。子View的LayoutParams:
- 确定的数值,
childSize - MATCH_PARENT
- WRAP_CONTENT
- 确定的数值,
需要确定的
- 子View的大小状态
- 子view的尺寸大小
尺寸确定的规则
父容器的大小状态处于
EXACTLY状态时,
子容器限定在这个大小。child layout mode size 确定的大小 EXACTLY childSize 子View大小可以是自身大小,后期再做确定。 MATCH_PARENT EXACTLY parentContentSize 父容器多大,子View就可以多大。大小为父容器大小。 WRAP_CONTENT AT_MOST parentContentSize 最大尺寸为父容器尺寸,本身内容不能超过和父容器尺寸。 父容器尺寸处于
AT_MOST状态时,
子View尺寸不能超过这个尺寸。child layout mode size 确定的大小 EXACTLY childSize 子View的大小可以为自身的大小。后期再做确定 MATCH_PARENT AT_MOST parentContentSize 父容器大小未确定,但子容器想要和父容器一定大。那么确定子View最大可以和父容器一样大。 WRAP_CONTENT AT_MOST parentSize 子View需要确定自己的尺寸,最大不超过父容器大小。 父容器处于
UNSPECIFIED状态,需要根据子View的最终大小来确定自己状态。child layout mode size 确定的大小 EXACTLY childSize 子View尺寸为一个确定大小. MATCH_PARENT UNSPECIFIED 待定 子view根据自身情况,确定大小。 WRAP_CONTENT UNSPECIFIED 待定 子View根据自身情况,确定大小。
Android中View大小的确定过程的更多相关文章
- Android中View绘制流程以及invalidate()等相关方法分析
[原文]http://blog.csdn.net/qinjuning 整个View树的绘图流程是在ViewRoot.java类的performTraversals()函数展开的,该函数做的执行过程可简 ...
- Android中View的绘制过程 onMeasure方法简述 附有自定义View例子
Android中View的绘制过程 onMeasure方法简述 附有自定义View例子 Android中View的绘制过程 当Activity获得焦点时,它将被要求绘制自己的布局,Android fr ...
- 源码解析Android中View的measure量算过程
Android中的Veiw从内存中到呈现在UI界面上需要依次经历三个阶段:量算 -> 布局 -> 绘图,关于View的量算.布局.绘图的总体机制可参见博文< Android中View ...
- 【转】Android中View的绘制过程 onMeasure方法简述 附有自定义View例子
Android中View的绘制过程 当Activity获得焦点时,它将被要求绘制自己的布局,Android framework将会处理绘制过程,Activity只需提供它的布局的根节点. 绘制过程从布 ...
- Android中View绘制流程以及invalidate()等相关方法分析(转载的文章,出处在正文已表明)
转载请注明出处:http://blog.csdn.net/qinjuning 前言: 本文是我读<Android内核剖析>第13章----View工作原理总结而成的,在此膜拜下作者 .同时 ...
- Android中View和ViewGroup介绍
1. 概念Android中的View与我们以前理解的“视图”不同.在Android中,View比视图具有更广的含义,它包含了用户交互和显示,更像Windows操作系统中的window. ViewGro ...
- 深入理解Android中View
文章目录 [隐藏] 一.View是什么? 二.View创建的一个概述: 三.View的标志(Flag)系统 四.MeasureSpec 五.几个重要方法简介 5.1 onFinishInflate ...
- Android中View绘制流程以及invalidate()等相关方法分析(转)
转自:http://blog.csdn.net/qinjuning 前言: 本文是我读<Android内核剖析>第13章----View工作原理总结而成的,在此膜拜下作者 .同时真挚地向渴 ...
- Android 中View的绘制机制源代码分析 一
尊重原创: http://blog.csdn.net/yuanzeyao/article/details/46765113 差点儿相同半年没有写博客了,一是由于工作比較忙,二是认为没有什么内容值得写, ...
随机推荐
- 一行css代码搞定响应式布局
在这篇文章中,我将教你如何使用 CSS Grid 来创建一个超酷的图像网格图,它将根据屏幕的宽度来改变列的数量.最精彩的地方在于:所有的响应特性被添加到了一行 css 代码中.这意味着我们不必将 HT ...
- 【转载】腾讯云安全组如何开放3306端口让Mysql可访问
Mysql数据库的默认端口号为3306,在服务器安装好Mysql数据库后,如果使用的服务器是阿里云或者腾讯云服务器,如果在后台启用了安全组功能,则需要在安全组中对3306端口的入站规则进行放行,只有在 ...
- var img = new Image()
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- AE开发—利用IQueryFilter接口进行属性查询
在ArcGis Engine二次开发过程中,经常会需要用到查询统计的功能,而IQueryFilter是最常见的属性字段查询接口,可以用来做一些简单的查询工作. 现在有一些公交站点和公交路线的数据,可视 ...
- CentOS7安装CDH 第十四章:CDH的优化
相关文章链接 CentOS7安装CDH 第一章:CentOS7系统安装 CentOS7安装CDH 第二章:CentOS7各个软件安装和启动 CentOS7安装CDH 第三章:CDH中的问题和解决方法 ...
- 实现数字转换RMB大写~
实现的功能是将数字“673”转换成“陆佰柒拾叁” “3681”转换成“叁仟陆佰捌拾壹” “8007”转换成“捌仟零柒” 主要使用了数组和循环来实现 代码雏形 package com.te ...
- 华为SDN:解决传统网络3大问题
转:http://mp.ofweek.com/tele/a145613326756 科技潮人 2013-08-05 14:20 传统网络之困 互联网爆炸式增长,除了规模和发展速度远超之前所有曾出现的数 ...
- [Jenkins][GitHub]2 持续集成环境初探
预计阅读时间:30分钟 部署环境:Jenkins ver. 2.61 + Centos7 + Java 1.8 参考链接: http://www.jianshu.com/p/22b7860b4e81 ...
- cuda环境搭建
cuda环境搭建 cuda 的安装 一篇很不错的博客 https://blog.csdn.net/u014529295/article/details/78766258 另外官网也有介绍 https: ...
- Java 反射原理
一.Java 反射的定义 反射机制是在运行状态中, 对于任意一个类, 都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法或者属性: 二.反射提供的功能: 在运行时判断任意 ...