在当一个活动接收到焦点时,将被要求绘制它的布局。
Android框架将处理这个绘画的过程,但是活动必须提供它的布局层次的根节点。
绘画从布局的根节点开始。
它被要求来测量和绘制布局树。
绘画通过遍历布局树并渲染每个和失效区域相交的视图来处理。
相应的,每个视图组负责请求绘制它的子视图(通过draw() 方法)而每个视图负责画它自己。因为这个树是顺序遍历的,这意味着先画父节点(也就是在屏幕后面),然后按照树中出现的顺序画其同层次节点。
框架将不会画不在失效区域的视图,而且还将会帮你画视图背景。
你可以强制一个视图被重画,通过调用invalidate()。
绘画布局共有两步:一个度量过程和一个布局过程。
度量过程在measure(int, int)里实现且是一个自顶向下的视图树遍历。
每个视图在递归时往下推送尺寸规格。
在度量过程的最后,每个视图都已经保存了自己的度量。
第二个过程发生在layout(int, int, int, int) 中并且也是自顶向下。
在这个过程中,每个父节点负责定位它的所有子节点,通过使用在度量过程中计算得到的尺寸。
当一个视图的measure()方法返回时,它的getMeasuredWidth()和getMeasuredHeight() 值必须被设置,以及所有这个视图子节点的值。一个视图的度量的宽度和高度值必须符合父视图引入的限制。这确保在度量过程之后,所有父节点接受所有它们的子节点的度量值。
一个父视图可能会在其子视图上多次调用measure()方法。
比如,父视图可能会通过未指定的尺寸调用measure来发现它们的大小,然后使用实际数值再次调用measure(),如果所有子视图未做限制的尺寸总合过大或过小(也即是,如果子视图之间不能对各自占据的空间达成共识的话,父视图将会干预并设置第二个过程的规则)。
要开始一个布局,可调用requestLayout()。这个方法通常在视图认为它自己不再适合它当前的边界的情况下被调用。
度量过程使用两个类来交流尺寸。
View.MeasureSpec类被视图用来告诉它们的父视图它们想如何被度量和定位。
基础的LayoutParams类仅仅描述了视图想有多大(高和宽)。
对于每个维度,它可以指定下面之一:
· 一个准确的数值
· FILL_PARENT, 这意味着视图想和父视图一样大(减掉填充padding)。
· WRAP_CONTENT, 这意味着视图只想有刚好包装其内容那么大(加上填充)
对于不同的ViewGroup子类,有相应的LayoutParams子类。
比如,相对布局RelativeLayout有它自己的LayoutParams子类,这包含了能够让子视图横向和竖向居中显示的能力。
度量规格(MeasureSpecs)被用来沿着树从父到子的下传度量需求。
一个MeasureSpecs可以是下面三种模式之一:
· UNSPECIFIED: 这被父视图用来决定其子视图期望的尺寸。
比如,一个线性布局可能在它的子视图上调用measure() on its child,通过设置其高度为UNSPECIFIED 以及一个宽度为EXACTLY 240,来找出这个子视图在给定240像素宽度的情况下需要显示多高。
· EXACTLY: 这被父视图用来给子视图强加一个准确的尺寸。子视图必须使用这个大小,并确保其所有的后代将适合这个尺寸。
· AT_MOST: 这被父视图用来给子视图强加一个最大尺寸。子视图必须确保它自己以及所有的后代都适合这个尺寸。
参考:SDK文档
http://developer.android.com/guide/topics/ui/how-android-draws.html
分享到:
相关推荐
Android中View绘制流程
Android中View绘制流程以及invalidate()等相关方法分析
详细介绍了Android View绘制过程
Android中View(视图)绘制不同状态背景图片原理深入分析Android中View(视图)绘制不同状态背景图片原理深入分析Android中View(视图)绘制不同状态背景图片原理深入分析Android中View(视图)绘制不同状态背景图片原理深入...
Android利用View绘制折线图,柱状图,饼状图。不用第三方类库直接进行实现了,非常好的例子哦
Android中View控件的Demo,值得学习。实现画多个圆圈的效果。
自定义View,绘制水平/垂直居中文本。精确度无限接近原生TextView 博客地址http://blog.csdn.net/u014702653/article/details/51985821
当 Activity 接收到焦点的时候,它会被请求绘制布局,该请求由 Android framework 处理.绘制是从根节点开始,对布局树进行 measure 和 draw。整个 View 树的绘图流程在ViewRoot.java类的performTraversals()函数展开...
Android自定义View基本绘制流程及实例
测量流程决定了View的大小,布局流程决定了View的位置,那么绘制流程将决定View的样子,一个View该显示什么由绘制流程完成。以下源码均取自Android API 21。 从performDraw说起 前面几篇文章提到,三大工作流程始于...
android绘制view的过程简单描述
主要给大家介绍了关于Android中View绘制的三大流程,View的工作流程主要是指measure、layout、draw这三大流程,即测量、布局和绘制,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们...
该例子为滑块在屏幕中可随意的移动,有助于你理解android中View绘制流程。
在android里面通过view画线,小弟的练习作品
NULL 博文链接:https://1002878825-qq-com.iteye.com/blog/1812390
自定义View绘制一个太极旋转图片demo
Android View的绘制高级篇 二(饼状图,三角图)
Window即窗口,这个概念在AndroidFramework中的实现为android.view.Window这个抽象类,这个抽象类是对Android系统中的窗口的抽象。在介绍这个类之前,我们先来看看究竟什么是窗口呢? 实际上,窗口是一个宏观的思想...
资源为Android自定义View的心形绘制源码,欢迎下载。有问题请及时告知,谢谢。