`
ericbaner
  • 浏览: 177006 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android如何描绘视图

 
阅读更多

原英文地址:http://developer.android.com/guide/topics/ui/how-android-draws.html

 

以下为本人原创翻译,转载请说明出处,欢迎指正!

 

当一个Activity获得焦点时,它将被请求去描绘它的布局(layout)。Android框架将会处理这个描绘的过程,但是Activity必须提供它的布局层次的根结点。

描绘(绘图,Drawing)由布局的根结点开始,要求测量和描绘整个布局树。描绘处理是通过遍历整个树,渲染每个与失效区域交叉的视图完成的。(Drawing is handled by walking the tree and rendering each View that intersects the invalid region.译者按:这里"invalid region"直译为失效区域,本质上是指视图的需要重新描绘的一部分,通过重绘失效区域而保持其它部分不变可以让描绘过程更加有效率。) 框架不会描绘不在失效区域的视图。框架会帮助描绘视图的背景。可以通过调用invalidate()强制一个视图描绘。

依次地,每个视图组合(View Group)将负责请求描绘它的每一个子视图(使用draw()方法),每一个视图将负责描绘自身。因为布局树是被按序遍历的,这意味着父视图将会先于它们的子视图描绘(即父视图在子视图之下),而兄弟结点视图将按其在树中出现的次序描绘。

布局的描绘是一个两阶段的过程:测量阶段和布局阶段。(Drawing the layout is a two pass process: a measure pass and a layout pass)测量阶段由measure(int , int)实现,是一个对视图树自上而下的遍历。在这个迭代中,每个视图将尺寸说明沿树向下传递。在测量阶段结束时,每个视图都将保存了其尺寸值。 第二个阶段由layout(int ,int, int, int)实现,也是一个对视图树自上而下的遍历。在这个遍历过程中,每个父视图负责使用在测量阶段计算得到的尺寸大小,定位(放置)其所有的子视图。

当一个视图的measure()方法返回时,它的getMeasuredWidth()和getMeasuredHeight()值必须被设置,并且连同其所有子视图也要一起被设置。一个视图的测量宽度和测量高度值必须遵从其父视图施加的约束。这保证了在测量阶段结束时,所有的父视图都接受了其所有子视图的尺寸。


一个父视图有可能对其子视图多次调用measure()方法。例如,如果所有子视图的非约束尺寸的总和太大了或太小了,父视图可能使用未确定尺寸(unspecified dimensions)测量每个子视图一次来发现它们想要多大的空间,然后使用实际数值再次调用measure()。(即如果子视图们不能在它们每个能占用多大空间上达成一致,那么父视图将介入调停,在第二次调用时设定规则) 

 

测量阶段使用两个类来传递尺寸。视图用View.MeasureSpec类来告知其父视图他们想要如何被测量和定位。基本的LayoutParams类仅描述了视图想要多大的宽度和高度。 对每个维度尺寸,可以设置为以下值之一:

1)一个具体的数值
2)FILL_PARENT, 意味着视图想要和它的父视图一样大(要减去padding填充尺寸)
3)WRAP_CONTENT, 意味着视图想要刚好足够装入其内容的大小(要加上padding填充尺寸)

对不同的ViewGroup的子类,还有一些相应的LayoutParams的子类。例如, RelativeLayout有自己的LayoutParams的子类,其包含了将其子视图水平和垂直方面居中的能力。

MeasureSpecs用来将测量要求由树中的父视图向下传给子视图。一个MeasureSpec可以为以下三种模式之一:


1)UNSPECIFIED:  父视图用来确定子视图要求的尺寸。例如,一个LinearLayout可能对其高度设置为UNSPECIFIED,而宽度设置为EXACTLY 240的子视图调用measure(),来确定该子视图在给定240像素宽度下,想要多高的尺寸。
2)EXACTLY: 父视图用来强加子视图一个具体的尺寸值。 子视图必须使用该尺寸,并且保证其所有后代视图要适配该尺寸。
3)AT_MOST: 父视图用于强加子视图一个最大的尺寸值。子视图必须保证自身和其所有后代视图要适配该尺寸。

 

 

另外,可通过调用requestLayout()来初始化一个布局,该方法一般是由一个视图针对自身来调用,当其相信已不再适配当前的界限时。

分享到:
评论

相关推荐

    android View视图的绘制

    在Android开发中,View是构建用户界面的基本元素,它负责绘制和处理用户的交互。自定义View允许开发者根据项目需求创建独特且复杂的UI组件,比如在描述中提到的折线图、柱状图和饼图。这些图表在数据分析、统计展示...

    Android自定义视图实现手指移动轨迹

    【Android自定义视图实现手指移动轨迹】 在Android开发中,有时我们需要自定义视图以实现特定的功能,比如记录和展示用户的手指移动轨迹。本文将深入探讨如何在Android中利用自定义视图来实现这一功能,同时也会...

    Android-Android双波浪加载动画

    实现这种双波浪加载动画,开发者需要对Android的动画系统有深入的理解,包括帧动画、属性动画以及自定义视图的绘制原理。以下将详细介绍这些关键知识点: 1. **帧动画(AnimationDrawable)**:在Android中,帧动画是...

    运行闪退Android项目源码一款跑步计速及描绘跑步路径跑步软件.rar

    这款名为"运行闪退Android项目源码一款跑步计速及描绘跑步路径跑步软件"的压缩包文件,包含了一个Android应用程序的源代码,该程序旨在帮助用户跟踪他们的跑步速度并记录跑步路线。源代码可能用于教育目的,允许...

    android曲线图源码

    在Android开发中,曲线图是一种常见的数据可视化工具,尤其在展示动态变化的数据或者复杂的数据关系时,曲线图能提供直观且易于理解的视图。在本案例中,我们讨论的主题是"android曲线图源码",这通常涉及到如何在...

    Android下 实现折纸动画效果

    在Android中,我们可以使用`Path`对象来描绘折痕路径,然后利用`Canvas`进行绘制。同时,我们需要计算每个部分的透明度和位置,以便在动画过程中呈现正确的折叠效果。 在`FoldableLayout`这个项目中,开发者可能...

    Android雷达波纹动画(可做地图或者倒计时)

    总结来说,创建Android雷达波纹动画需要掌握属性动画系统、自定义视图的绘制以及动画监听与更新。通过学习和实践,开发者可以创造出各种独特的视觉效果,提升应用的用户体验。对于`RadarScanView-master`项目,...

    Android中用ViewPage实现真实翻页效果

    然而,标准的`ViewPager`并不直接支持真实的翻页效果,我们需要借助第三方库或者自定义视图来实现这一功能。在这个案例中,`android_page_curl-master`可能是用来实现这种翻页效果的一个开源项目,它可能包含了一种...

    Android弧形列表

    为了绘制弧形轨迹,可能需要在onDraw()方法中使用Path对象,并结合arcTo()或quadTo()等方法来描绘抛物线。同时,为了使列表滚动流畅,还需要处理好动画效果,确保item的进入和离开屏幕时有平滑的过渡。 3. **适配器...

    android:仪表盘(简单易实现)

    使用`Path`对象来描绘指针形状,`Paint`对象设置颜色和线条宽度。`canvas.rotate()`用于旋转指针以表示不同数值。 - 实现交互逻辑,如监听触摸事件,根据手指移动调整指针角度。 2. **使用ProgressBar**: - 如果...

    android自定义的边缘凹凸的View

    本文将深入探讨如何实现一个“android自定义的边缘凹凸的View”,也就是一个模仿卡券效果的视图。这个效果通常用于增强用户体验,给予用户一种实物卡片的视觉感受。 首先,我们要理解自定义View的基本流程。自定义...

    Android-涂鸦板

    总结来说,《Android-涂鸦板》应用充分利用了Android平台的特性,通过触摸事件处理、图形渲染、色彩选择、视图重绘以及文件操作等功能,为用户提供了一个自由发挥创意的涂鸦空间。开发者在实现这些功能时,需要深入...

    Android代码-围住神经猫

    开发者可能使用Bitmap来加载和显示猫和其他游戏元素的图片,同时利用Path对象来描绘方块和猫的路径。颜色、形状和动画效果的实现则涉及到Color、ColorFilter、Shader等图形处理技术。 用户交互部分,Android的触摸...

    Android-卡券常用的锯齿Android布局

    但是,对于复杂的形状和设计,如锯齿边缘的卡券,我们可能需要自定义视图或自定义布局来实现。 自定义布局通常涉及继承`ViewGroup`或`LinearLayout`等基础布局类,并重写其中的关键方法,如`onDraw()`。在这个方法...

    android 时序图

    时序图展示了消息在参与交互的对象之间的传递,以及这些消息的顺序,从而提供了一个动态的行为视图。 标题"android 时序图"指出我们关注的是在Android应用开发中的时序图应用。时序图通常用于表示用户操作、系统...

    Android 超炫的Path Button效果源码.rar

    本源码资源提供了实现这种超炫Path Button效果的方法,是Android开发者学习自定义视图和动画的绝佳案例。 首先,让我们深入理解这个Path Button的实现原理。在Android中,我们可以利用`Path`类来绘制复杂的图形路径...

    android 仿真翻页效果.zip

    对于复杂的翻页动画,可能需要使用帧动画序列来逐帧绘制,或者利用Android的属性动画系统,如`ObjectAnimator`和`ValueAnimator`,动态地改变视图的属性来实现连续的动画效果。 5. **触摸事件处理**:为了响应用户...

    Android-AElongPayLibProject-个人中心头像波动效果

    总的来说,"Android-AElongPayLibProject-个人中心头像波动效果"是一个专注于提升用户体验的Android组件,它结合了Android的图像加载技术、动画系统和自定义视图的绘制,为开发者提供了一个优雅的头像点击反馈效果。...

    Android-RecyclerView-Sort-Ascending-Descending:RecyclerView是您已经很久没有进入android的那些观点之一。 自从在API级别22中进行了介绍以来,它就如此出名并得到了广泛的利用。RecyclerView类驻留在android.view.ViewGroup中。 Android将其描绘为可适应的视图,用于将有限的窗口提供给大量数据集。 对我们来说,我们忙于这个数据集

    Android将其描绘为可适应的视图,用于将有限的窗口提供给大量数据集。 对我们来说,我们忙于这个数据集:如何对其进行排序。 安排信息至关重要,尤其是在诸如recyclerview wihich之类的细分市场中,它可以显示大量...

    Android代码-GiftAnimation

    - Android提供了多种动画机制,如帧动画(AnimationDrawable)、属性动画(Property Animation)和视图动画(View Animation)。"GiftAnimation"可能基于这些技术之一,特别是属性动画,因为它可以对对象的任何属性...

Global site tag (gtag.js) - Google Analytics