当一个Activity被激活时,它将被要求绘制自身的layout。Android Framework会去处理绘制的过程,但是Activity必须提供其layout结构的根节点(root node)。
实际上就是我们使用setContentView(layoutID)时那个layout id,通过这种方式我们就可以告知系统要显示哪一组View。
绘制过程就是从根节点开始的。而测量和绘制layout tree则是必须的。绘制工作是通过走读layout tree并显示相应的View来完成的(这些View都是在invalid区域的)。按照顺序,每个ViewGroup都会child view(通过draw() method),而这些child view会负责自己绘制自己。由于绘制过程是按照顺序(实际就是我们在layout xml文件声明的顺序)从上到下,从父到子来执行的,所以有可能造成某个后边的View覆盖前边声明的View这种现象。
绘制layout有两个过程:一个过程是测量(measure),另一过程是布局(layout)。测量是通过measure(int, int)方法来执行,并且会遍历我们的view tree。每个View都会去发布它的dimension specifications,并顺着树一直执行下去,这个过程是一个递归的过程。最终,每个View都会存储它的测量信息。第二个过程发生在layout(int, int, int, int)中,也是从上到下的顺序。在这个过程中,parent layout会负责安排child view的position,而这个position就会使用之前测量的View的大小信息。
当一个View的measure() 方法返回时,它的getMeasuredWidth() and getMeasuredHeight()的value就一定会被设置好,相应的它的child views的值也会被设置好。一个View的measured hight和measured width必须符合其parent的要求。这保证了最终的测量结果一定是parent接受的结果。一个parent view可以针对其child view呼叫多次measure() 方法。例如,parent view可以先调用一次measure(),并且不指明尺寸,而看child view的需求。如果发现child的需求超出了parent的要求,那么在使用一次measure(),这次parent就可以指明具体的尺寸了。
Measure过程实际上有两个类在期间起作用。一个是View.MeasureSpec,另一个是LayoutParams。先看看Google是怎么定义MeasureSpec的:
A MeasureSpec encapsulates the layout requirements passed from parent to child. Each MeasureSpec represents a requirement for either the width or the height. A MeasureSpec is comprised of a size and a mode. There are three possible modes:
UNSPECIFIED
The parent has not imposed any constraint on the child. It can be whatever size it wants.
EXACTLY
The parent has determined an exact size for the child. The child is going to be given those bounds regardless of how big it wants to be.
AT_MOST
The child can be as large as it wants up to the specified size.
MeasureSpecs are implemented as ints to reduce object allocation. This class is provided to pack and unpack the <size, mode> tuple into the int.
从这我们可以看出它其中定义的是parenet对child的要求,这其中包含了对height和width的要求。(父亲对孩子有哪些要求就在说明)
而LayoutParams是ViewGroup的nested class。我们来看下Google是怎么说明这个类的:
LayoutParams are used by views to tell their parents how they want to be laid out. See ViewGroup Layout Attributes for a list of all child view attributes that this class supports.
The base LayoutParams class just describes how big the view wants to be for both width and height. For each dimension, it can specify one of:
•an exact number
•FILL_PARENT, which means the view wants to be as big as its parent (minus padding)
•WRAP_CONTENT, which means that the view wants to be just big enough to enclose its content (plus padding)
There are subclasses of LayoutParams for different subclasses of ViewGroup. For example, AbsoluteLayout has its own subclass of LayoutParams which adds an X and Y value.
从这段话中我们可以了解这个LayoutParams类是用于child view向parent view传达自己的意愿的一个东东(孩子想变成什么样就要在这向其父亲说明)。值得注意的是LayoutParams只是一个base class。实际上每个不同的ViewGroup都有自己的LayoutParams子类。
分享到:
相关推荐
**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 API文档中部分核心知识点的概述,实际文档内容还包括图形绘制、动画、安全性、测试等方面,是Android开发者不可或缺的学习资料。通过阅读和理解这份完整的API文档,开发者可以更好地掌握Android系统...
示例中可能展示了如何扩展Android的基础View类或ViewGroup类,实现自定义绘制逻辑和交互行为。 3. **布局(Layouts)** - Android支持多种布局管理器,如线性布局(LinearLayout)、相对布局(RelativeLayout)、...
源码的学习有助于我们理解如何扩展Android的UI组件,以及如何处理视图的绘制和布局。 总的来说,`Android-Prefix-Input`是一个实用的工具,它简化了在`EditText`中添加前缀的过程,提高了Android应用的用户体验。...
首先,Android UI由多个组件构成,如布局(Layouts)、控件(Widgets)和视图(Views)。布局是容器,用于组织和管理子视图,常见的布局有线性布局(LinearLayout)、相对布局(RelativeLayout)、帧布局...
// Draw the underlying views into the bitmap ViewGroup decorView = (ViewGroup) surfaceView.getRootView(); decorView.draw(canvas); // Draw the SurfaceView content surfaceView.draw(canvas); // ...
<com.example.customviews.MarqueeTextView android:id="@+id/custom_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="这是自定义滚动的文字" /> ``` 3. ...
这份“Android培训PPT”很可能是由专业人士制作的,旨在帮助初学者或有经验的开发者深入理解Android开发的核心概念和技术。 PPT的第一部分可能涵盖了Android的基础知识,包括Android系统的架构、版本历史以及它在...
- 控件(Views):如按钮、文本框等,是用户界面的基本组件。 - 布局(Layouts):线性、相对、网格、约束等,用于组织和排列UI元素。 - 主题和样式:通过定义主题和样式,可以统一应用的视觉风格。 - 动态UI:...
<com.example.customviews.RingProgressBar android:id="@+id/custom_progress_bar" android:layout_width="100dp" android:layout_height="100dp" /> ``` 接下来,我们创建`RingProgressBar.java`类,继承自...
15.1.2 绘制优化 / 493 15.1.3 内存泄露优化 / 493 15.1.4 响应速度优化和ANR日志分析 / 496 15.1.5 List View和Bitmap优化 / 501 15.1.6 线程优化 / 501 15.1.7 一些性能优化建议 / 501 15.2 内存泄露...
----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...
这个压缩包“CustomViews”很可能是包含了一系列Android自定义控件的示例项目,旨在帮助开发者理解和学习如何在Android Studio 1.0.2环境下创建和使用自定义控件。 自定义控件通常涉及以下关键知识点: 1. **...
<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:...
7. **自定义视图(Custom Views)**:当系统默认的控件无法满足需求时,开发者可以创建自定义视图。这涉及到重写ondraw()方法,用Canvas进行绘制。 8. **触摸反馈(Touch Feedback)**:为了提供良好的触感,...