view的测量,布局,绘制

View 就是屏幕上的一块矩形区域. Android原生桌面上的那些应用图标其实是 textview, 可以再 Android Device
Monitor 中看(dump view).

View只能有一个父View, 为什么? 这样设计, 系统底层只需跟最顶层的View交互. View是否必须有父View, 不是, 可以使用
WindowManager 加到屏幕上

Android是 C/S 架构, 我们写的客户端应用就是C, 系统提供的服务是S. Java中各个应用程序都只能运行在自己的内存中,
不允许跨进程访问.

Binder - aidl(一份通信的协议,
说明书), Android的跨进程访问方式. Binder是Linux下的一个驱动, 驱动是用来管理硬件的,
Binder是用来管理一小段内存的.

a应用

参考博客: http://blog.csdn.net/singwhatiwanna/article/details/38426471

什么是View

在Android的官方文档中是这样描述的:表示了用户界面的基本构建模块。一个View占用了屏幕上的一个矩形区域并且负责界面绘制和事件处理。

手机屏幕上所有看得见摸得着的都是View。这一点对所有图形系统来说都一样,例如ios的UIView。

一个View要想被显示出来,需要经过3个步骤

1.要有多大的区域

measure(判断是否需要调用 measure, 比如缓存)--->onMeasure(由我们重写)--->setMeasuredDimension(使用成员变量记住宽和高)

2.确定要画的位置

layout--->setFrame(用成员变量记住上下左右,
并且判断是否改变, 如果改变, 调用onSizeChanged)--->onLayout(由我们重写)

3.画成什么样子

draw--->onDraw(由我们重写)--->dispatchDraw(View中是空处理,
ViewGroup中会做一些事)

View System 中最顶层的View

2.3之前:

DecorView--->LinearLayout--------TextView = Fill  42dip

1 300  1 300      
 --------FrameLayout   FILL      FILL

1  
540    1 960-42-42

2.3之后:

DecorView--->View(确切的说是ViewGroup)--------ActionBar

--------FrameLayout

DecorView是一个FrameLayout, 他的父亲是 ViewRoot

ViewRoot -- 是一个Binder

|  1 540  1
960

|              
                     1   540   1  42*1.5

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)

两个参数由父控件传入, 表示期望此View的大小, 使用一个 int 型的值表示两个参数, 最高两位表示 mode, 低30位表示 size, 可以使用
View.MeasureSpec
这个类获取

/**

* Measure specification mode: The parent has not imposed any
constraint

* on the child. It can be whatever size it wants.

*/

public static final int UNSPECIFIED = 0 <<
MODE_SHIFT;

/**

* Measure specification mode: 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.

*/

public static final int EXACTLY     = 1 <<
MODE_SHIFT;

/**

* Measure specification mode: The child can be as large as it
wants up

* to the specified size.

*/

public static final int AT_MOST     = 2 <<
MODE_SHIFT;

mode 是一种基于策略的考虑, 父控件的期望值并不代表此View必须是这个值, 但是, 系统是希望能遵守这个期望.

view.getViewTreeObserver.addGlobalLayoutListener(new

protected void onLayout(boolean changed, int left, int top, int right, int
bottom)

在View中, 这个方法是个空实现, 但是在ViewGroup 中, 这个方法是个抽象方法, 子类必须要实现.

来自为知笔记(Wiz)

时间: 2024-10-18 03:25:24

view的测量,布局,绘制的相关文章

Android view的测量及绘制

讲真,自我感觉,我的水平真的是渣的一匹,好多东西都只停留在知道和会用的阶段,也想去研究原理和底层的实现,可是一看到代码就懵逼了,然后就看不下去了, 说自己不着急都是骗人的,我自己都不信,前两天买了本<Android 群英传>,江湖上都说这是一本初级过渡到中级不错的进阶书,所以准备看一下,才看了两天,今天 看到了view的测量及绘制,还有自定义view(还没看完),学到什么就写篇博客吧,算是对自己所学的一个总结和记录吧,也可以督促自己,如果有讲的不对的地方或者 有歧义的地方,欢迎大家吐槽批评我!

android View的测量和绘制

本篇内容来源于android 群英传(徐易生著) 我写到这里,是觉得徐易生讲的确实很好, 另外加入了一些自己的理解,便于自己基础的提高. 如果要绘制一个View , 就需要先取测量它,也就是需要知道它的大小和位置. 这样我们就能在屏幕中滑出来它了.这个过程是在onMeasure()方法中完成的. 一.测量模式 测量view的大小时,需要用到MeasureSpec (测量规范)这个类来指定测量模式 ,一共有3种 EXACTLY (精确模式) , 系统默认值. 如果我们指定控件宽高为 xxdp, x

[05] Android View 测量-布局-绘制流程

[译]Android view 测量布局和绘制的流程

原文链接 创造优秀的用户体验是我们开发者的主要目标之一.为此, 我们首先要了解系统是如何工作的, 这样我们才可以更好的与系统配合, 从它的优点中获益, 规避它的缺陷. 之前关于Android渲染过程的文章 这次我们主要关注Measure/Layout(测量和布局)的阶段, 这些阶段决定了视图的大小和位置, 以便于我们能够绘制它. Step 1: Measure 测量 目标: 确定是图的大小 视图的大小包含其子视图的大小, 且必须符合其父视图的要求 视图的大小由2个方面决定: 测量宽度与测量高度

自定义View_1_关于View,ViewGroup的测量和绘制流程

自定义View(1) ------ 关于View,ViewGroup的测量和绘制流程 在Android当中,自定义控件属于比较高级的知识体系,今天我们就一起研究研究关于自定义View的那点事,看看它到底高深在什么地方.使用自定义View可以实现不同的效果,比原生控件更加的灵活,当然难度也是大大的加大了,但是不要怕,我们一起慢慢学习,看透他,也就那么点事.好了,不废话了进入我们的正题吧! Android自定义控件的意思就是说我们把我们想要绘制的View显示在屏幕上,并且可以使他有某种功能,这就是一

android源码解析(十八)--&gt;Activity布局绘制流程

这篇文章是承接上一篇文章(Android布局加载流程:http://blog.csdn.net/qq_23547831/article/details/51284556)来写的,大家都知道Activity在Android体系中扮演者一个界面展示的角色,通过上一篇文章的分析,我们知道Activity是通过Window来控制界面的展示的,一个Window对象就是一个窗口对象,而每个Activity中都有一个相应的Window对象,所以说一个Activity对象也就可以说是一个窗口对象,而Window

长谈:关于 View Measure 测量机制,让我一次把话说完

<倚天屠龙记中>有这么一处:张三丰示范自创的太极剑演示给张无忌看,然后问他记住招式没有.张无忌说记住了一半.张三丰又慢吞吞使了一遍,问他记住多少,张无忌说只记得几招了.张三丰最后又示范了一遍,张无忌想了想说,这次全忘光了.张三丰很满意,于是放心让张无忌与八臂神剑去比试. 首先声明,这一篇篇幅很长很长很长的文章.目的就是为了把 Android 中关于 View 测量的机制一次性说清楚.算是自己对自己较真.写的时候花了好几天,几次想放弃,想放弃的原因不是我自己没有弄清楚,而是觉得自己叙事脉络已经紊

快速理解android View的测量onMeasure()与MeasureSpec

笔者之前有一篇文章已经使用onMeasure()解决了listview与scollview的显示冲突问题,博客地址如下: onMeasure简单方法 完美解决ListView与ScollView冲突问题! 在此就针对View的测量以及onMeasure()涉及的几个问题做一个详细解释: 一.MeasureSpec的概念: MeasureSpec通过将SpecMode和SpecSize打包成一个int值来避免过多的对象内存分配,为了方便操作,其提供了打包和解包的方法.SpecMode和SpecSi

【转载】快速理解android View的测量onMeasure()与MeasureSpec

笔者之前有一篇文章已经使用onMeasure()解决了listview与scollview的显示冲突问题,博客地址如下: onMeasure简单方法 完美解决ListView与ScollView冲突问题! 在此就针对View的测量以及onMeasure()涉及的几个问题做一个详细解释: 一.MeasureSpec的概念: MeasureSpec通过将SpecMode和SpecSize打包成一个int值来避免过多的对象内存分配,为了方便操作,其提供了打包和解包的方法.SpecMode和SpecSi