【Android应用开发技术:用户界面】视图组件View

作者:郭孝星
微博:郭孝星的新浪微博
邮箱:[email protected]
博客:http://blog.csdn.net/allenwells
Github:https://github.com/AllenWells

【Android应用开发技术:用户界面】章节列表

View作为所有UI组件的子类,它代表了一个空白的矩形区域。ViewGroup继承了View,因此ViewGroup也可以被当做View使用,它同时也作为一个容器组件用来盛转其他组件,ViewGroup同样还可以再次包含ViewGroup。

Android图形用户界面的组件层次如下图所示:

这里写图片描述

一 View的绘制原理

1.1 View树的绘制流程

当Activity接收到焦点时,它会被请求绘制布局,该请求由framework处理。绘制从根节点开始,对布局树进行measure和draw。整个View树的绘制流程在ViewRoot类的performTraversals()函数中展开。该函数做的工作如下所示:

  1. 是否需要重新计算视图大小(measure)
  2. 是否需要重新安置视图的位置(layout)
  3. 是否需要重绘(draw)

View树的绘制流程如下图所示:

这里写图片描述

1.2 View绘制流程函数调用链

View绘制流程函数调用链如下图所示:

这里写图片描述

当用户主动调用request,只会触发measure和layout过程,而不会触发draw过程。

1.3 measure和layout过程

从整体上看measure和layout两个过程的执行:
树的遍历是有序的,由父视图到子视图,每一个ViewGroup负责绘制它所有的子视图,最底层的View负责绘制自身。

如下图所示:

这里写图片描述

1.3.1 measure过程

measure过程由measure(int, int)方法发起,从上到下有序测量View,在measure过程的最后,每个视图都存储了自己的尺寸大小和测量规格。measure过程会为一个View及所有子节点的mMeasuredWidth和mMeasuredHeight变量赋值,该值可以通过getMeasuredWidth()和getMeasuredHeight()方法获得,而这两个值必须在子视图的约束范围之内,才可以保证所有的父视图都接收所有子视图的测量。
如果子视图对于measure得到的大小不满意的时候,父视图会介入并设置测量进行第二次measure。

measure过程中传递尺寸的两个类

  1. ViewGroup.LayoutParams类(View自身的布局参数与)
    MATCH_PARENT:子视图和父视图一样大小(不包括padding值)
    WRAP_CONTENT:视图正好能包裹其内容大小(包括padding值)
  2. MeasureSpecs类(父视图对子视图的测量要求)
    UNSPECIFIED:父视图不对子视图进行任何约束,它可以达到它锁期望的任何尺寸。比如ScrollView和ListView。
    EXACTLY:父视图为子视图指定一个确切尺寸,而且无s论子视图期望多大,它都必须在该指定大小的边界内,对应的属性为 match_parent 或具体指&#x
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值