Android学习笔记之View(二)

View加载的流程之测量:rootView调用measure()→onMeasure();

measure()是final方法,表明Android不想让开发者去修改measure的框架,开发者可以onMeasure方法。

来看一下measure的代码:

  • public?final?void?measure(int?widthMeasureSpec,?int?heightMeasureSpec)?{??
  • ????if?((mPrivateFlags?&?FORCE_LAYOUT)?==?FORCE_LAYOUT?||??
  • ????????????widthMeasureSpec?!=?mOldWidthMeasureSpec?||??
  • ????????????heightMeasureSpec?!=?mOldHeightMeasureSpec)?{??
  • ????????mPrivateFlags?&=?~MEASURED_DIMENSION_SET;??
  • ????????if?(ViewDebug.TRACE_HIERARCHY)?{??
  • ????????????ViewDebug.trace(this,?ViewDebug.HierarchyTraceType.ON_MEASURE);??
  • ????????}??
  • ????????onMeasure(widthMeasureSpec,?heightMeasureSpec);??
  • ????????if?((mPrivateFlags?&?MEASURED_DIMENSION_SET)?!=?MEASURED_DIMENSION_SET)?{??
  • ????????????throw?new?IllegalStateException("onMeasure()?did?not?set?the"??
  • ????????????????????+?"?measured?dimension?by?calling"??
  • ????????????????????+?"?setMeasuredDimension()");??
  • ????????}??
  • ????????mPrivateFlags?|=?LAYOUT_REQUIRED;??
  • ????}??
  • ????mOldWidthMeasureSpec?=?widthMeasureSpec;??
  • ????mOldHeightMeasureSpec?=?heightMeasureSpec;??
  • }??

    ?
    ?

?
?

一个界面的展示可能会涉及到很多次发measure,因为一个视图往往包含多个子视图,每个视图都需要经历一次measure过程。ViewGroup中定义了measureChildren()方法来测量子视图,下面是measureChildren():

?
?

  • protected?void?measureChildren(int?widthMeasureSpec,?int?heightMeasureSpec)?{??
  • ????final?int?size?=?mChildrenCount;??
  • ????final?View[]?children?=?mChildren;??
  • ????for?(int?i?=?0;?i?<?size;?++i)?{??
  • ????????final?View?child?=?children[i];??
  • ????????if?((child.mViewFlags?&?VISIBILITY_MASK)?!=?GONE)?{??
  • ????????????measureChild(child,?widthMeasureSpec,?heightMeasureSpec);??
  • ????????}??
  • ????}??
  • }??

?
?

View加载的第二步: onLayout,这和measure差不多,都是由rootView调用layout()→onLayout()。

?
?

?
?

时间: 2024-09-28 21:58:37

Android学习笔记之View(二)的相关文章

Android学习笔记(十二)——使用意图传递数据的几种方式

使用意图传递数据的几种方式 点此获取完整代码 我们除了要从活动返回数据,也常常要传递数据给活动.对此我们可以使用Intent对象将这些数据传递给目标活动. 1.创建一个名为PassingData的项目,在activity_main.xml文件中添加一个Button: <Button android:id="@+id/btn_SecondActivity" android:layout_width="fill_parent" android:layout_hei

Pro Android学习笔记(十二):了解Intent(下)

解析Intent,寻找匹配Activity 如果给出component名字(包名.类名)是explicit intent,否则是implicit intent.对于explicit intent,关键就是component 名字,在<intent-fliter>中声明的其他属性被忽略.对于implicit intent,则根据action,category和data来进行匹配.然而一个intent fliter中可以声明多个actions,多个categories,多个data属性,因此可以满

Android学习笔记(四二):SQLite、ListView、ContextMenu

继续上一个例子,结合ListView中对SQLite进行操作. 通过CursorAdapter在ListView中的数据呈现 在上一个例子中,我们可以对SQLite中的数据库进行增删改查,将数据读到游标Cursor中,然后一一读出.在Android中可以通过CursorAdapter直接将数据映射到ListView中,如下处理: public class Chapter22Test1 extends ListActivity{    private SQLiteDatabase  db = nu

【转】 Pro Android学习笔记(五二):ActionBar(5):list模式

可以在action bar中加入spinner的下来菜单,有关spinner,可以参考Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner. list的样式和theme有关,如果theme设置不正确,还可能会出现异常. 相关的代码如下: public class ListActionBarDemo extends SearchTestCase3 implements OnNavigationListener{ //List触发的回调函数接口    @Ov

【转】 Pro Android学习笔记(四二):Fragment(7):切换效果

目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transaction进行切换,很方便提供切换的效果. 利用setTransition() 在Pro Android学习笔记(三九):Fragment(4):基础小例子-续的“Step 4:实现showDetail(int index),如何管理fragment”中,介绍了如何在容器FrameLayout中通过frag

【转】 Pro Android学习笔记(八二):了解Package(1):包和进程

文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见Pro Android学习笔记(六四):安全和权限(1):签发apk,我们将对package做进一步了解. 每个apk都有一个唯一的根包名,在AndroidManifest.xml中定义,如下.开发者为包进行签发,前面和包名绑定,其他开发者不能对这个包进行更新. <?xml version="1

Android学习笔记(十二)——实战:制作一个聊天界面

//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 运用简单的布局知识,我们可以来尝试制作一个聊天界面. 一.制作 Nine-Patch 图片 : Nine-Patch图片是一种被特殊处理过的 png 图片,能够指定哪些区域可以被拉伸而哪些区域不可以.一般用来作为聊天信息的背景.在此我们先准备一张png图片.然后在 Android sdk 目录下有一个 tools 文件夹,在这个文件夹中找到 draw9patch.bat文件. 双击打开之后, 在导航栏点击 File→

Pro Android学习笔记(三二):Menu(3):Context菜单

什么是Context menu 在桌面电脑,我们都很熟悉Context menu,按鼠标右键显示的菜单就是context菜单.在Android中,通过长时间鼠标按键可以触发context菜单.对于触屏设备,手指长按就是长鼠标按键事件. 一个activity有一个且只能有一个OptionMenu,一个view可以有一个且最多只能有一个ContextMenu.检查鼠标长按是基于view来监听.因此一个activity中可有多少个view,就可以有多少个ContextMenu. 注册View带有Con

Android学习笔记(五二):服务Service(中)- 继承Service类

通过IntentService的继承类实现命令触发的服务,也可以直接通过Service的继承类来实现.在IntentService中的例子,我们增加了StopService( )的方式,用于试验.在实际应用中,IntentService常用于一次性运行,自动结束的情况,不需要人工停止干预.对于需要人工干预的停止的,长时间(或无限制)运行的情况,可直接继承Service的方式,例如音乐播放.IntentService也是Service的一个继承类. 继承Service类 在本例中,我们中我们模拟音

【转】 Pro Android学习笔记(七二):HTTP服务(6):HttpURLConnection

目录(?)[-] Http Get的使用方式 基础小例子 Cookie的使用 重定向 HTTP POST的小例子 基础小例子 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog.csdn.net/flowingflying/ 之前我们都是使用HttpClient来进行http连接,在上一次学习中,HttpClient远比封装socket要来得复杂,有管理器,有连接池.从Android2.3版本开始,可以是java.net.HttpURLC