`

Android中View绘制过程分析

 
阅读更多
在当一个活动接收到焦点时,将被要求绘制它的布局。
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是构建用户界面的基本元素,它的绘制流程是开发者理解并优化UI性能的关键。本篇文章将深入探讨Android中View的绘制流程,以及如何通过自定义ViewGroup进行更复杂的布局管理。 首先,我们要...

    Android中View绘制流程以及invalidate()

    本篇文章将深入探讨Android中View的绘制流程以及`invalidate()`方法的工作原理。 首先,我们需要了解Android视图的生命周期,它包括测量(Measure)、布局(Layout)和绘制(Draw)三个主要阶段: 1. **测量阶段(Measure...

    Android中View(视图)绘制不同状态背景图片

    Android中View(视图)绘制不同状态背景图片原理深入分析Android中View(视图)绘制不同状态背景图片原理深入分析Android中View(视图)绘制不同状态背景图片原理深入分析Android中View(视图)绘制不同状态背景图片原理深入...

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

    在Android开发中,View是构建用户界面的基本元素,它的绘制流程和`invalidate()`等相关方法是开发者需要深入理解的关键概念。本文将详细解析Android中View的绘制流程,以及`invalidate()`等核心方法的工作原理。 ...

    自定义滑动按钮为例图文剖析Android自定义View绘制

    本文将以自定义滑动按钮为例,深入解析Android自定义View的绘制过程。 首先,了解View和ViewGroup的关系至关重要。View是所有UI元素的基础类,它负责绘制和事件处理。而ViewGroup则作为容器,用于管理并布局多个...

    Android利用View绘制饼状图,折线图,柱状图等

    总结来说,Android利用自定义View绘制饼状图、柱状图和折线图主要涉及到以下几个步骤: 1. 创建自定义View类。 2. 在`onMeasure()`方法中确定View的大小。 3. 在`onDraw()`方法中,根据数据计算图形的各个参数,如...

    Android中的View与ViewGroup绘制过程,手势监听顺序与使用

    ViewGroup不仅管理子View的布局,还参与到绘制过程中。在布局时,ViewGroup会调用measure()和layout()方法对每个子View进行测量和定位。而在绘制时,ViewGroup会先绘制自己,然后递归地绘制其所有子View。 手势监听...

    Android 自定义View绘制居中文本

    在Android开发中,自定义View是一项常见的需求,它允许开发者根据特定的设计要求或者功能扩展来创建独特的用户界面组件。本文将深入探讨如何实现一个自定义的View,使其能够精确地绘制水平和垂直居中的文本,效果...

    Android自定义view实现水印效果

    在Android开发中,自定义View是一种常见的需求,用于实现特定的视觉效果或功能。本教程将探讨如何通过自定义View来实现水印效果,让应用能够在屏幕上动态地展示自定义的文字水印。水印通常用于保护版权或者增加信息...

    Android 自定义画布canvas 实现绘制和清空画布功能

    在Android开发中,自定义画布Canvas是实现图形绘制的核心工具。Canvas提供了丰富的API,允许开发者在屏幕上绘制各种形状、图像以及文字等。本教程将深入探讨如何利用Canvas实现绘制和清空画布的功能。 首先,我们...

    android2D图形绘制

    Android的View类提供了 invalidate() 方法,用于标记视图需要重绘,从而实现动画效果。开发者可以通过在onDraw()回调中改变图形的位置、大小或颜色,每次调用invalidate()都会触发重新绘制,形成连续的视觉效果。 ...

    在android里面通过view画线

    在Android开发中,View是构建用户界面的基本元素。利用View,开发者可以自定义各种复杂的UI组件,其中之一就是画线。本篇文章将详细讲解如何在Android的View中实现画线功能,以此来创建一个简单的画线练习作品。 ...

    android曲线图的绘制

    在Android开发中,有时我们需要创建动态的、可定制的曲线图来展示数据,这通常涉及到自定义View的绘制。这个“android曲线图的绘制”是一个关于如何在Android平台上实现曲线图表的小型示例项目。该项目可能包含了一...

    Android的graphics绘制了印章图像

    在实际的印章绘制中,可能会涉及到路径(Path)和形状(Shape)的使用,例如椭圆或圆形来表示印章的轮廓,以及Path的arcTo()方法来画弧线。 3. 使用Paint进行样式设置 Paint对象可以设置字体大小、颜色、描边宽度、...

    Android自定义View基本绘制流程及实例

    在Android开发中,自定义View是一项重要的技能,它允许开发者根据需求创建独特的用户界面元素,以实现更加丰富和个性化的交互体验。本篇文章将深入探讨Android自定义View的基本绘制流程,并通过实例进行详解。 首先...

    13问13答全面学习Android View绘制

    13. **动画和过渡**:在View绘制中,动画和过渡也是重要组成部分。通过`ObjectAnimator`、`ValueAnimator`等工具,开发者可以为View添加平滑的动画效果,增强用户体验。 总之,Android View的绘制是一个复杂但有序...

Global site tag (gtag.js) - Google Analytics