当一个Activity获得了焦点后,它将被要求去绘制它的layout(也就是那句在onCreate方法里面的setContentView()方法所设置的layout)。android的framework会处理这个绘制的过程,但是这个Activity也必须提供这个将绘制的View的layout层级的根节点信息。
ps:这里需要解释下最后一句话。我们都知道,一个layout文件是一个包含了多个层级的xml文件。里面的各个xml节点信息就代表了一个又一个的layout层级——也就是这里所谓的“layout层级的根节点”。借由xml技术的本身特点,我们可以保证每个层级在layout中的唯一性,如此一来,我们就可以很方便地为我们即将绘制于某layout上的View进行绘制部位定位了。另外学过数据结构的同学应该知道,节点是数据结构“树”中的概念。所以根据这个,我推测,layout的xml文件信息被加载到内存中后,实际上是以一个“树”的形式存在的。
绘制某个View的工作从该View即将绘制的layout根节点开始。framework在这之前会预测量和绘制这个layout“树”。而绘制该layout“树”的工作则会这么做:遍历这个“树”,然后为每个占有了某个未使用区域的View预留出某个已知大小(该大小就是我们常常用到的layout_width和layout_height属性中所包含的信息)的区域供以后绘制View时使用。之后,各个ViewGroup会依次请求将它们的子View被绘制(通过ViewGoroup的draw方法),而每个View在被绘制的时候又会调用它自身的onDraw方法来把自身绘制出来。因为layout“树”是按顺序遍历的,这就意味着父View(例如ViewGroup)会在子View之前被绘制。
tips:framework不会绘制那些不在未使用区域的View,而且它会为View绘制背景。你可以强制性的去让一个View被绘制——通过利用invalidate()方法。
ps:绘制一个完整的layout的步骤大致如下:1、将layout.xml文件解析至内存,让这些layout信息以一个“树”的形式存在。2、framework遍历该“树”,从上到下依次绘制View。3、绘制View时,会在未使用的区域为即将绘制的该View预留空间,接着调用该View的draw方法来绘制它。
绘制一个layout包含了两大过程:一个是尺寸测试过程。该过程中会在layout“树”里自顶向下地对每个View进行尺寸测量。尺寸测量的工作由View类的measure(int, int)方法进行实现。在"树"遍历的工程中,每个View会调用该方法,然后通过读取一些开发者设定的信息(layout_height layout_width)来保存自己的尺寸信息。当尺寸测试过程进入尾声时,每一个View都已经保存了它的尺寸信息了。另一个过程就是具体的绘制了。在这个自顶向下遍历树的绘制过程中,每个父View会调用layout(int,
int, int, int)方法,并结合子View在尺寸测量过程中所保存的尺寸信息,来安放该子View在自己内部的位置。
当一个View的measure方法返回时,它的width和height——以及它的子View的——属性必须已经被设定完毕。一个View的width和height必须遵从它的父View的相关尺寸约束——这样就保证了在尺寸测试过程尾声时,所有的父View都能够顺利的接受它们的子View。一个父View可能会在其子View上多次调用measure方法。例如,父View可能会先调用它的子View的measure方法来得知它们究竟多大,进而好为它们预留绘制空间,然后父View有接着会又调用measure来测试是否该尺寸适合该View。
tips:通过调用requestLayout()可以初始化一个layout的相关信息。这个方法通常是View在发觉自己的当前所处范围不适合自己的当前情况时被主动调用。
在尺寸测试过程中,有两个类比较重要。一个是View.MeasureSpec。它被View用来告诉它的父View自己想要是多大以及如何地被放置。另一个是我们已经很熟悉的LayoutParams,它仅仅描述了这个View的height和width的信息。对于height和width,可以被如下指定:
1、一个确切的像素值
2、FILL_PARENT,这个意味着该height 或width和父View的相同(减去padding的像素值)。
3、WRAP_CONTENT,这个意味着该View的height和width以刚好包含其内容为准。
各个ViewGroup有自己相应的LayoutParams子类来实现各自个性化的设置需求。例如RelativeLayout有它自己的LayoutParams子类来设定其子View的相对位置。
MeasureSpecs被用来将父View的需求传递给子View。它可以被设置为以下三种模式之一:
-
UNSPECIFIED,父View对子View的尺寸大小没有特殊要求。
-
EXACTLY,父View需要把子View设置为某个特定的像素值。子View必须为这个值,而且要保证它的所有子View也在这个尺寸之内绘制。
-
AT_MOST,告诉子View一个最小的尺寸值。
分享到:
相关推荐
**Android Views 深度解析** 在Android应用开发中,Views是构建用户界面的基本元素,它们是用户与应用交互的窗口。"Android views"这个主题深入探讨了Android中视图的概念、使用方式以及如何通过XML进行布局设计。...
### Android常见Views速查表详解 #### 一、TextView(文本视图) **用途:** `TextView` 是用于显示文本的最基础控件。 **属性介绍:** - **`android:id`**: 定义该视图在XML布局中的唯一标识。 - **`android:...
【标题】"android-collage-views.zip" 是一个与Android相关的压缩包,它包含了用于创建拼贴画视图的源代码。这类视图通常在应用程序中用于展示多个图像组合成一个整体效果,比如照片墙或者自定义布局,能够增加应用...
Android视图是用户界面的基本构建块,它们负责绘制屏幕上的元素并处理与用户的交互。常见的View包括按钮、文本框、图像视图等。在Android中,所有视图都继承自`View`类或`ViewGroup`类。`ViewGroup`是布局容器,如...
在Android开发中,视图(Views)和小部件(Widgets)是构建用户界面的基本元素,它们使得应用程序具有交互性和可视化效果。"views-widgets-samples"是一个专门为开发者设计的开源项目,旨在展示Android平台上views和...
在Android开发中,自定义视图(Custom Views)是一项重要的技能,它允许开发者构建更加丰富和独特的用户界面。本文将基于《Building Android UIs with Custom Views》这本书籍,来详细介绍如何使用Android的自定义...
示例中可能展示了如何扩展Android的基础View类或ViewGroup类,实现自定义绘制逻辑和交互行为。 3. **布局(Layouts)** - Android支持多种布局管理器,如线性布局(LinearLayout)、相对布局(RelativeLayout)、...
以上只是Android API文档中部分核心知识点的概述,实际文档内容还包括图形绘制、动画、安全性、测试等方面,是Android开发者不可或缺的学习资料。通过阅读和理解这份完整的API文档,开发者可以更好地掌握Android系统...
<com.example.customviews.MarqueeTextView android:id="@+id/custom_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="这是自定义滚动的文字" /> ``` 3. ...
源码的学习有助于我们理解如何扩展Android的UI组件,以及如何处理视图的绘制和布局。 总的来说,`Android-Prefix-Input`是一个实用的工具,它简化了在`EditText`中添加前缀的过程,提高了Android应用的用户体验。...
// Draw the underlying views into the bitmap ViewGroup decorView = (ViewGroup) surfaceView.getRootView(); decorView.draw(canvas); // Draw the SurfaceView content surfaceView.draw(canvas); // ...
首先,Android UI由多个组件构成,如布局(Layouts)、控件(Widgets)和视图(Views)。布局是容器,用于组织和管理子视图,常见的布局有线性布局(LinearLayout)、相对布局(RelativeLayout)、帧布局...
Android UI 界面绘制原理是Android开发中的核心概念,它涉及到Android应用的视觉呈现和交互体验。理解这一原理对于优化应用程序性能、创建流畅的用户体验至关重要。在这个分析中,我们将深入探讨Android界面绘制的...
<com.example.customviews.StarBar android:id="@+id/star_bar" android:layout_width="wrap_content" android:layout_height="wrap_content" app:starCount="5" app:selectedColor="#FFD700" app:...
<com.example.customviews.RingProgressBar android:id="@+id/custom_progress_bar" android:layout_width="100dp" android:layout_height="100dp" /> ``` 接下来,我们创建`RingProgressBar.java`类,继承自...
【标题】"第一行代码Android学习练习代码3" 涉及的是Android应用程序开发中的实践环节,主要聚焦在自定义视图(Custom Views)的创建和应用。Android平台提供了丰富的UI组件,但有时为了满足特定设计需求或实现独特...
- 控件(Views):如按钮、文本框等,是用户界面的基本组件。 - 布局(Layouts):线性、相对、网格、约束等,用于组织和排列UI元素。 - 主题和样式:通过定义主题和样式,可以统一应用的视觉风格。 - 动态UI:...
Xamarin.Android提供了`Android.Views.SurfaceView`和`Android.Views.TextureView`两种选择。SurfaceView适合高性能的图形绘制,因为它有自己的渲染线程;而TextureView更适合需要进行动画和视频处理的场合,因为它...
`onDraw()`方法是Android绘制的基本入口,开发者在这里可以利用`Canvas`对象进行各种图形绘制。 接下来,动画在Android中主要有两种实现方式:帧动画(Frame Animation)和属性动画(Property Animation)。考虑到...
这个压缩包“CustomViews”很可能是包含了一系列Android自定义控件的示例项目,旨在帮助开发者理解和学习如何在Android Studio 1.0.2环境下创建和使用自定义控件。 自定义控件通常涉及以下关键知识点: 1. **...