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,取值是下面三种情况之一:

    1. FILL_PARENT / MATCH_PARENT,
      取值是 -1.

      填充满父容器, minus padding.

    2. WRAP_CONTENT,
      取值是 -2.

      尺寸尽量小,能包住自身的全部内容就行, plus padding.

    3. 一个确定的尺寸,大于等于0的一个数值。

父容器的大小状态

  • Padding

    留白。自身内容的大小加上留白就是父容器的内容的真正大小。

  • MeasureSpec

    当父容器要确定子View的大小的时候,父容器需要告诉子View自身的大小状态。当父容器所属的大小状态不同时,对子View的尺寸约束是不一样的。父容器大小状态有下面三种情况:

    parent child
    UNSPECIFIED 父容器对子View没有任何约束,子View可以按自身需要,任意大小。
    EXACTLY 父容器大小是一个确定的数值,子View只能限定在指定大小内。
    AT_MOST 父容器本身以及内含的所有子View大小不能超过指定大小。
  • View的尺寸大小和尺寸状态

    尺寸大小的数据类型是 int,
    8个字节。

    尺寸大小和尺寸状态在很多时候需要一起传递,为了减少对象的分配,把三种尺寸状态编码到尺寸大小int变量的最高位2个位中。

    1. UNSPECIFIED

      +-----------+----------
      | 00xx xxxx | 剩余的7个字节. 0x00 << 30 + value
      +-----------+----------
    2. EXACTLY

      +-----------+----------
      | 01xx xxxx | 剩余的7个字节. 0x01 << 30 + value
      +-----------+----------
    3. AT_MOST

      +-----------+----------
      | 10xx xxxx | 剩余的7个字节. 0x10 << 30 + value
      +-----------+----------

子View尺寸的最终确定

子View有一个期望的尺寸大小,父容器有尺寸大小约束,这两方面的约束协调,用来计算View的大小状态。

  1. 根据父容器的尺寸状态,以及子View的LayoutParams,可以确定子View的大小和状态:MeasureSpec,并要求子View确定自身大小。

    调用子View的measure()方法,子View的onMeasure()方法也会被执行。

  2. 子View在onMeasure()方法中,根据父容器给出的尺寸大小和约束,根据自身情况,确定最终的大小。

  3. 父容器根据子View的确定的大小,最终确定自身大小。

需要考虑的因素

  • 父容器的尺寸状态:

    1. EXACTLY
    2. AT_MOST
    3. UNSPECIFIED
  • 父容器的尺寸大小: parentSize
  • 父容器的留白:parentPadding

    父容器真正内容的大小是: parentSize - parentPadding,
    用变量 parentContentSize代替。

  • 子View的LayoutParams:

    1. 确定的数值, childSize
    2. MATCH_PARENT
    3. 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大小的确定过程的更多相关文章

  1. Android中View绘制流程以及invalidate()等相关方法分析

    [原文]http://blog.csdn.net/qinjuning 整个View树的绘图流程是在ViewRoot.java类的performTraversals()函数展开的,该函数做的执行过程可简 ...

  2. Android中View的绘制过程 onMeasure方法简述 附有自定义View例子

    Android中View的绘制过程 onMeasure方法简述 附有自定义View例子 Android中View的绘制过程 当Activity获得焦点时,它将被要求绘制自己的布局,Android fr ...

  3. 源码解析Android中View的measure量算过程

    Android中的Veiw从内存中到呈现在UI界面上需要依次经历三个阶段:量算 -> 布局 -> 绘图,关于View的量算.布局.绘图的总体机制可参见博文< Android中View ...

  4. 【转】Android中View的绘制过程 onMeasure方法简述 附有自定义View例子

    Android中View的绘制过程 当Activity获得焦点时,它将被要求绘制自己的布局,Android framework将会处理绘制过程,Activity只需提供它的布局的根节点. 绘制过程从布 ...

  5. Android中View绘制流程以及invalidate()等相关方法分析(转载的文章,出处在正文已表明)

    转载请注明出处:http://blog.csdn.net/qinjuning 前言: 本文是我读<Android内核剖析>第13章----View工作原理总结而成的,在此膜拜下作者 .同时 ...

  6. Android中View和ViewGroup介绍

    1. 概念Android中的View与我们以前理解的“视图”不同.在Android中,View比视图具有更广的含义,它包含了用户交互和显示,更像Windows操作系统中的window. ViewGro ...

  7. 深入理解Android中View

    文章目录   [隐藏] 一.View是什么? 二.View创建的一个概述: 三.View的标志(Flag)系统 四.MeasureSpec 五.几个重要方法简介 5.1 onFinishInflate ...

  8. Android中View绘制流程以及invalidate()等相关方法分析(转)

    转自:http://blog.csdn.net/qinjuning 前言: 本文是我读<Android内核剖析>第13章----View工作原理总结而成的,在此膜拜下作者 .同时真挚地向渴 ...

  9. Android 中View的绘制机制源代码分析 一

    尊重原创: http://blog.csdn.net/yuanzeyao/article/details/46765113 差点儿相同半年没有写博客了,一是由于工作比較忙,二是认为没有什么内容值得写, ...

随机推荐

  1. 从 ASP.NET Core 2.1 迁移到 2.2 踩坑总结

    官方迁移文档:https://docs.microsoft.com/zh-cn/aspnet/core/migration/21-to-22?view=aspnetcore-2.2&tabs= ...

  2. js防抖节流

    防抖(debounce) 所谓防抖,就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间. 防抖函数分为非立即执行版和立即执行版. 非立即执行版: 第一 ...

  3. Modelsim问题集锦

    前言 收集工程调试中遇到的modelsim问题. 问题 (1)仿真发现时钟信号和理论上的数据信号没有边沿对齐. 解决:一般是时钟精度不匹配的问题. 如果想要1ns的精度则代码中的精度需设置为: v语法 ...

  4. Vue指令之事件修饰符

    事件修饰符: + .stop 阻止冒泡 + .prevent 阻止默认事件 + .capture 添加事件侦听器时使用事件捕获模式 + .self 只当事件在该元素本身(比如不是子元素)触发时触发回调 ...

  5. 前端框架开始学习Vue(三)

    初步安装.与搭建    https://www.cnblogs.com/yanxulan/p/8978732.html ----如何搭建一个vue项目 安装 nodejs,,, npm i == np ...

  6. java一些基本算法

    本文主要介绍一些常用的算法: 冒泡排序:两两相互之间进行比较,如果符合条件就相互兑换. //冒泡排序升序 public static int[] bubblingSortAsc(int[] array ...

  7. HttpContext & HttpRuntime

    问题引出 HttpContext.Current.Cache .VS. HttpRuntime.Cache HttpRuntime.Cache:获取当前应用程序的Cache HttpContext.C ...

  8. [dev][ipsec][distributed] strongswan如何做热迁移/高可用/High Availability

    问题描述: 原生的基于kernel 的 strongswan 如何做高可用,HA,High Availability 问题分析: 基于我们已知的,ipsec,strongswan的知识.问题分解如下: ...

  9. zabbix 3.2.2 server web展示如何显示中文 (三)

    1.确认zabbix是否开启了中文支持功能(/var/www/html/zabbix/include/locales.inc.php) 2.登录zabbix后,点击可爱的小公主吧 Admin(zabb ...

  10. Codeforces Round 585

    Codeforces Round 585 浅论如何发现自己是傻子的-- 反正今天是完全蒙的,水了签到题就跑了-- A. Yellow Cards 签到题. 众所周知,CF的签到题一般是一道神神奇奇的数 ...