attachToRoot到底有什么作用?

前言(唠嗑)

前两天在路上瞎逛的时候,一只黄色的小狗突然跑到我身边,绕着我转圈圈。我一瞬间就被这只小狗狗给征服了,脑袋以超光速开始运转,甚至连给小狗狗名字都取号了。然后耳边就传来这样的一段对话:

这个毛颜色可以换吗?

可以的,等再长大一点,就可以剃光再重新弄。

它的尾巴太长了,能弄断一点吗?

可以的,尾巴可以减掉的。

不知道多少电影动漫里,都有小狗狗对着人开心地摇着尾巴的温馨场景。还是算了吧,我这个人不那么会照顾小动物,况且,少一份买卖就少一份杀戮。多少人号称自己爱狗,但是自己实际上的行为,自己实际上的做法,却时刻让那些甚至不养狗的人表示心寒!

正文

天天在用这个方法,这个方法的一些细节,我到底掌握了多少,来来来,看看吧~

这篇文章我不仅仅打算直接讲这个attachToRoot参数到底是用来干什么的,我还想理一理关于视图绘制的一些思路。既然是思路,大段大段的内心独白是少不了的,还请读者给予一些理解(本人话痨一个,找不到人聊天就和自己聊天)。

视图绘制说到底就是如下三点:

  1. 视图绘制的位置
  2. 视图绘制的大小
  3. 视图绘制的内容

前两点也可以合并成一点即你希望在哪个区域绘制视图的具体内容?我们都知道我们常规的视图追本溯源都是继承自View和ViewGroup,而且后者还继承自View。

但是为什么需要这么实现呢?其实说到底还是为了更好的进行复用,当然,最开始肯定是仅仅只有View,毕竟根据我所知,Android最初是用于开发摄像机这样的小型智能终端的,毕竟是小型的,所以视图什么的,肯定不需要那么复杂。我看一些玩摄影的朋友,照相机上就算有显示屏可以用来操作,那操作也是非常的简单。

但是当挪用到手机上时,视图绘制这些操作就明显复杂的多了,然后一些和我一样睿智的工程师就发现,其实视图完全可以分为两种,一种是单纯的用于绘制内容的视图,另外一种则用来专门管理前者,用于控制前者的绘制区域,像我们非常常见的LinearLayout等等Layout都是属于后者。

然后经过这样的方式对视图进行分类之后,视图的层级关系就能确立了,我们的手机屏幕其实就是一个画板,其中的每一个子视图的工作就是在这个巨大的画板里先找到自己的管辖区域,然后在这个区域里做好自己的分内工作(有的可能是负责继续管理子视图,有的就可能直接进行视图的绘制)。

哎呀,好像有点偏离主题了= =,敷衍一下,贴一份inflate的代码,下一篇章就讲。

public View inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot) {synchronized (mConstructorArgs) {Trace.traceBegin(Trace.TRACE_TAG_VIEW, "inflate");final Context inflaterContext = mContext;final AttributeSet attrs = Xml.asAttributeSet(parser);Context lastContext = (Context) mConstructorArgs[0];mConstructorArgs[0] = inflaterContext;View result = root;try {advanceToRootNode(parser);final String name = parser.getName();if (DEBUG) {System.out.println("**************************");System.out.println("Creating root view: "+ name);System.out.println("**************************");}if (TAG_MERGE.equals(name)) {if (root == null || !attachToRoot) {throw new InflateException("<merge /> can be used only with a valid "+ "ViewGroup root and attachToRoot=true");}rInflate(parser, root, inflaterContext, attrs, false);} else {// Temp is the root view that was found in the xmlfinal View temp = createViewFromTag(root, name, inflaterContext, attrs);ViewGroup.LayoutParams params = null;if (root != null) {if (DEBUG) {System.out.println("Creating params from root: " +root);}// Create layout params that match root, if suppliedparams = root.generateLayoutParams(attrs);if (!attachToRoot) {// Set the layout params for temp if we are not// attaching. (If we are, we use addView, below)temp.setLayoutParams(params);}}if (DEBUG) {System.out.println("-----> start inflating children");}// Inflate all children under temp against its context.rInflateChildren(parser, temp, attrs, true);if (DEBUG) {System.out.println("-----> done inflating children");}// We are supposed to attach all the views we found (int temp)// to root. Do that now.if (root != null && attachToRoot) {root.addView(temp, params);}// Decide whether to return the root that was passed in or the// top view found in xml.if (root == null || !attachToRoot) {result = temp;}}} catch (XmlPullParserException e) {final InflateException ie = new InflateException(e.getMessage(), e);ie.setStackTrace(EMPTY_STACK_TRACE);throw ie;} catch (Exception e) {final InflateException ie = new InflateException(getParserStateDescription(inflaterContext, attrs)+ ": " + e.getMessage(), e);ie.setStackTrace(EMPTY_STACK_TRACE);throw ie;} finally {// Don't retain static reference on context.mConstructorArgs[0] = lastContext;mConstructorArgs[1] = null;Trace.traceEnd(Trace.TRACE_TAG_VIEW);}return result;}
}

Android视图绘制逻辑与思想(一):attachToRoot到底有什么作用?相关推荐

  1. Android视图绘制流程完全解析,带你一步步深入了解

    Android LayoutInflater原理分析,带你一步步深入了解View(一) Android视图绘制流程完全解析,带你一步步深入了解View(二) Android视图状态及重绘流程分析,带你 ...

  2. Android视图绘制流程完全解析,带你一步步深入了解View(二)

    在上一篇文章中,我带着大家一起剖析了一下LayoutInflater的工作原理,可以算是对View进行深入了解的第一步吧.那么本篇文章中,我们将继续对View进行深入探究,看一看它的绘制流程到底是什么 ...

  3. Android视图绘制流程完全解析(二)

    转载:http://blog.csdn.net/guolin_blog/article/details/16330267 https://segmentfault.com/a/119000000462 ...

  4. android 过度绘制

    1.概述   UI渲染操作通常依赖于两个核心组件:CPU与GPU.CPU负责包括Measure,Layout,Record,Execute的计算操作,GPU负责Rasterization(栅格化)操作 ...

  5. Android UI绘制流程分析(三)measure

    源码版本Android 6.0 请参阅:http://androidxref.com/6.0.1_r10 本文目的是分析从Activity启动到走完绘制流程并显示在界面上的过程,在源码展示阶段为了使跟 ...

  6. Android视图工作机制之measure、layout、draw

    前言 自定义View一直是初学者们最头疼的事情,因为他们并没有了解到真正的实现原理就开始试着做自定义View,碰到很多看不懂的代码只能选择回避,做多了会觉得很没自信.其实只要了解了View的工作机制后 ...

  7. Android进阶——Android视图工作机制之measure、layout、draw

    前言 自定义View一直是初学者们最头疼的事情,因为他们并没有了解到真正的实现原理就开始试着做自定义View,碰到很多看不懂的代码只能选择回避,做多了会觉得很没自信.其实只要了解了View的工作机制后 ...

  8. 【Android从零单排系列十一】《Android视图控件——日历、日期、时间选择控件》

    目录 一.日历.日期.时间组件基本介绍 二.几种常见的控件类型 1.CalendarView –日历控件 2. DatePicker –日期选择控件 3.TimePicker –时间选择控件 4.Ch ...

  9. 【Android View绘制之旅】Draw过程

    出效果:绘制 经过前面的准备工作 :[Android View绘制之旅]Measure过程,[Android View绘制之旅]Layout过程 我们的视图具备了宽高数据,位置数据,现在到了激动人心的 ...

最新文章

  1. wifidog接口文档(转)
  2. linux生成ext4镜像,mkfs.ext4生成分区镜像自动把文件转成了sparse怎么破?
  3. pythonsqlite3教程_使用 Python 在线操作 sqlite3
  4. mybatis 动态传入表名 注解_Mybatis动态sql的动态表名问题
  5. 虚拟机vmnet8每次都要先禁用再启用_【零成本 amp; 超详细】使用Win10自带的Hyper-V管理工具搭建虚拟机...
  6. My new English
  7. 递归法:从n个小球中取m个小球(不放回),共有多少种取法?
  8. javascript中object的运算符操作使用
  9. 妙启动_十张图带你了解中国国产奶酪巨头——妙可蓝多发展情况
  10. java核心技术卷一适合初学者吗_为什么我觉得Java核心技术卷一写的不好呢?
  11. MIUI刷第三方rec教程(回退系统)
  12. 我的世界服务器怎么修改标语,我的世界怎么用资源包修改闪烁标语
  13. 服务端软件安全测评标准及实施指南 V1.0
  14. Clojure学习03:数据结构(集合)
  15. 2021东软始业教育考试
  16. mysql.data.dll 位置_MySql.Data.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家...
  17. opencv应用——以图拼图
  18. .net4.7.2在win7安装失败
  19. python3.6.5安装包下载_Python3.6.5安装包 32/64位 官方免费版
  20. 从安全气囊到标配EDR,TOP10控制器供应商领跑市场

热门文章

  1. mysql查询去重第一条_Mysql用法记录 - Ashley-OSCHINA的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. shell date 获取昨天日期
  3. java 复合_Java复合语句的使用方法详解
  4. asp用于取代什么技术_.NET的未来:关于.NET5,每个.Net开发人员必须知道什么
  5. python数据可视化地图_python--地图可视化
  6. php仓储管理系统 eku_河南物流仓储外包哪里有 极鹭云仓
  7. oracle客户端下载 win8.1,WINDOWS8.1安装ORACLE客户端及配置
  8. cmd做个定时弹窗_揭秘200元山寨苹果耳机!一颗耳边的“定时炸弹”...
  9. mysql配置文件说明_mysql配置文件详解说明
  10. 三线压力传感器原理_进气压力传感器原理与检修