原文:How Android Draws Views

当一个Activity获取到焦点的时候,它的布局就开始被绘制。

绘制的过程由Android framework处理。但布局层级的根节点必须由Activity提供。

视图的绘制由布局的根节点开始,通过遍历布局树和渲染每个和无效区域交叉的视图,整个布局和它的子布局(layout tree)都会被测量并绘制。反过来,ViewGroup的职责是请求它的每个子元素被绘制(通过draw()方法),而每个View的职责则是绘制它们自己本身。(意思是ViewGroup只负责排位,而view自己负责绘制工作)因为元素是 按顺序排列的,因此,父元素总是先于子元素被绘制,而父元素的同级别元素则按照它们出现的先后顺序绘制。

布局的绘制分为两个过程: 测量过程和布局过程.

测量过程在measure(int,int)方法中实现。它是按照view tree的排列从上到下进行测量的。在测量过程结束后,每个View都保存了自己的尺寸。

布局过程在layout(int, int, int, int)方法中实现,它也是从上而下进行的。在这个过程中,子元素的父节点根据子元素在上一个步骤中取得的值安排好它们的位置。

当一个View的measure()方法返回的时候,它的getMeasuredWidth()和getMeasuredHeight()的值必须被设置好。当View的父元素对这个子View的宽高值有限制的时候,这个子View必须遵守这个限制。这样做能保证在测量过程结束的时候,子View的宽高值能被父元素所接受。一个父View可能会对它的子View调用多次measure方法。举个例子,父View第一次调用measure()方法是为了获取子View请求的宽高,宽高值取得后,父View会根据这些值再次调用measure方法,进而检测这些值是否超出了限制(太大或是太小),如果是,则父View会在第二个过程中进行限制。

在测量过程中,子元素可以使用ViewGroup.LayoutParams类告知父元素它们所请求的尺寸。

ViewGroup.LayoutParams包含两个值:

MATCH_PARENT:子元素需要和父元素一样大(减去补白[padding])

WRAP_CONTENT:子元素只需要刚好能够放置它们的内容 (加上padding)

ViewGroup不同的子类有不同的LayoutParams。例如,RelativeLayout也有自己的LayoutParams类。

这使得RelativeLayout可以在水平和垂直方向上在中心放置子元素.

而父元素则可以通过MeasureSpec类限制子元素的尺寸。MeasureSpec的值可以是下面三个中的其中一个。

UNSPECIFIED:单纯用于获取子元素请求的值,不对子元素设置限制。例如:LinearLayout可以对它的子元素的长和宽分别设置为UNSPECIFIED和EXACTLY的值为240,这样可以知道当给子元素的长是240px的时候,它所需要的高度度会是多少。

EXACTLY:父元素将子元素的值限制为指定的值。子元素必须使用这个值,并且保证它的所有后代元素在这个尺寸内可用。

AT_MOST:父元素指定子元素的最大尺寸。子元素必须保证它和它的所有后代元素在这个尺寸内可用。

注意:Android framework不会绘制不在无效区域的View,但是依然会负责绘制View的背景。

我们可以通过调用invalidate()方法强制一个View重新绘制。

通过调用requestLayout()初始化布局。当一个View对象认为现在的区域已经无法正常工作的时候就会调用这个方法。

关于有效区域和无效区域:无效区域是需要被更新的区域,有效区域无须被更新。

有windows 开发经验的人都应该知道,当一个窗口从被遮挡到出现,窗口会重新被绘制,而这个被遮挡的区域就是无效区域。因为当这个区域再次出现的时候,我们必须保证它的内容是最新的,因此需要被更新,即重新绘制.

有效区域之所有被称为有效区域,是因为它目前的状态已经是最新的,不需要更新,所以不需要被重绘。

[翻译] Android是怎样绘制视图的的更多相关文章

  1. 理解Android绘制视图的方式

    在创建自定义ViewGroup前,读者首先需要理解Android绘制视图的方式.我不会涉及过多细节,但是需要读者理解Android开发文档(见3.5节)中的一段话,这段话解释如何绘制一个布局.内容如下 ...

  2. Android之View绘制流程源码分析

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 对于稍有自定义View经验的安卓开发者来说,onMeasure,onLayout,onDraw这三个方法都不会陌生,起码多少都有所接触吧. 在安卓中 ...

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

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

  4. Android View的绘制机制流程深入详解(三)

    本系列文章主要着重深入介绍Android View的绘制机制及流程,第三篇主要介绍并分析视图状态以及重绘流程,首先剖析了 视图的几种状态,然后在深入分析视图的重绘机制流程. 真题园网:http://w ...

  5. Android View的绘制机制流程深入详解(二)

    本系列文章主要着重深入介绍Android View的绘制机制及流程,第二篇主要介绍并分析Android视图的绘制的原理和流程.主要从 onMeasure().onLayout()和onDraw()这三 ...

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

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

  7. android之View绘制

    Android系统的视图结构的设计也采用了组合模式,即View作为所有图形的基类,Viewgroup对View继承扩展为视图容器类,由此就得到了视图部分的基本结构--树形结构 View定义了绘图的基本 ...

  8. Android笔记--View绘制流程源码分析(一)

    Android笔记--View绘制流程源码分析 View绘制之前框架流程分析 View绘制的分析始终是离不开Activity及其内部的Window的.在Activity的源码启动流程中,一并包含 着A ...

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

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

随机推荐

  1. h1、h2、h3标签及strong标签对页面seo的影响

    今天和大家来聊下h1,h2,h3,strong几个标签,在网页中的使用对页面seo的影响,也阐述了个人的一些想法. 首先简要讲下H标签及strong标签的含义:<h1>.<h2> ...

  2. django+mysql学习笔记

    这段时间在学习mysql+django的知识点.借此记录以下学习过程遇到的坑以及心得. 使用的工具是navicat for mysql python 2.7.12 mysql-python 1.2.3 ...

  3. 多线程中的volatile和伪共享

      伪共享 false sharing,顾名思义,“伪共享”就是“其实不是共享”.那什么是“共享”?多CPU同时访问同一块内存区域就是“共享”,就会产生冲突,需要控制协议来协调访问.会引起“共享”的最 ...

  4. Golang接口(interface)三个特性(译文)

    The Laws of Reflection 原文地址 第一次翻译文章,请各路人士多多指教! 类型和接口 因为映射建设在类型的基础之上,首先我们对类型进行全新的介绍. go是一个静态性语言,每个变量都 ...

  5. 工业物联网或系统集成中应用消息队列(ActiveMQ,C#的demo)的场景全面分析

    1.[连载]<C#通讯(串口和网络)框架的设计与实现> 2.[开源]C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 2.应用SuperIO(SIO)和开源跨平台物联网框 ...

  6. Unable to download data from http://ruby.taobao.org/ & don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory.

    安装cocoapods,记录两个问题! 1.镜像已经替换成了 http://ruby.taobao.org/, 还是不能不能安装cocoapods, 报错:Unable to download dat ...

  7. IOS 杂笔-11(实现在外部无法改变UIView的size)

    我想题目说的或许不是很清楚,那么现在我详细介绍一下这篇随笔内容. 在外部无法改变UIVIew控件的size. 这里说是UIView,但是事实上,是大多数控件而绝非仅UIView. 想要实现在外部无法改 ...

  8. JS导出excel 兼容ie、chrome、firefox

    运用js实现将页面中的table导出为excel文件,页面显示如下: 导出的excel文件显示如下: 实现代码: <!DOCTYPE html> <html> <head ...

  9. bash编程之多分支if 语句及for循环

    第十七章.bash编程之多分支if 语句及for循环 if语句三种格式 多分支if语句练习 for循环 17.1.if语句的三种格式 单分支if语句 if condition;then 条件为真执行的 ...

  10. Would Your Work Habits Change if You Were Paid by the Job?

    原文地址:http://success-sys.com/2016/09/26/would-your-work-habits-change-if-you-were-paid-by-the-job/ A ...