导致View树遍历的时机

遍历View树意味着整个View需要重新对其包含的子视图分配大小并重绘,导致重新遍历的原因主要有三个
1.视图本身内部状况变化引起重绘。
2.第二个是View树内部添加或者删除了View。
3.View本身的大小及可见性发生变化。
能引起View树重新遍历的操作,总的来讲可以分为三类。一类是导致视图大小发生变化;第二类是导致ViewGroup重新为子视图分配位置;第三类是视图显示情况发生变化需要重绘。这三类情况最后都直接或者间接调用到三个函数,分别为invalidate()、requesetLayout()及requestFocus(),而这三个函数最终都会调用到ViewRoot中的schuedeuleTravesals()函数,该函数然后发起一个异步消息,消息处理中调用performTraversals()开始对整个View进行重新遍历。
能导致调用invalidate()函数的包含三种情况:
1、当应用程序改变视图显示属性时,调用setVisibility()。
2、当改变视图Selected状态时,调用setSelected()。
3、当改变视图Enable状态时,调用setEnable()函数。
能导致调用requestLayout()函数的情况包含两种:
1、当应用程序改变视图显示属性时,调用setVisibility(),由于显示或者不显示将影响其他兄弟视图的位置,因 此会调用到requestLayout()。
2、应用程序直接或间接调用该函数,间接调用是指应用程序调用了View类的其他函数,从而间接调用到requestLayout()。
requestFocus()一般由程序直接调用。
refreshDrawableList()
该函数的作用是根据状态标识,为视图赋予不同的Drawable对象。
1、给mPrivateFlags添加DRAWABLE_STATE_DIRTY标识,该标识仅在后面调用getDrawableState()函数中用于判断是否发生状态变化。
2、调用drawableSateChanged()。该函数是一个protected类型,只有Framework中的View子类可以重载该函数,一般来讲,就是ViewGroup重载了该函数。ViewGroup中重载该函数的作用仅仅是为了配合FLAG_ADD_STATES_FROM_CHILDRN标识,后面将会讲到该标识的作用。View类内部,该函数的默认实现包括以下几项。
(1)调用getDrawableState()获得视图的当前状态,然后再调用onCreateDrawableState()将这些状态转换为一个int[]型数组,这个数组的内部格式是预先定好的,DrawableStateList类可以识别该int[]数组。最后再将第一步设置的标识进行清除。
(2)mBGDrawable变量是该视图的背景图,它包含一个setState()函数,函数的参数正是上一步获得的int[]型数组,该函数内部会根据该int[]型数组为mBGDrawable找到真正的Drawable对象。
3、如果该视图有父视图,则调用父视图的childDrawableStateChanged()。父视图要么是ViewGroup类,要么是一个ViewRoot类。
ensureTouchMode()
这个函数的命名不够准确,从该函数内部分析来看,其作用是在Touch和非Touch直接切换时对视图的焦点状态进行处理。
setVisibility()
该函数用于改变视图的可视状态,可视状态包括GONE、VISIBLE、INVSIBLE三种。该函数内部很简单,首先调用setFlags(),然后调用mBGDrawable.setVisible()函数改变视图背景图的显示状态。
setEnable()
Enable状态仅仅是内部的一个逻辑,不会引起重新布局,仅仅是引起视图的重绘。
1、给mPrivateFlags变量添加ENABLE或者DISABLE标识,这由setEnalbe()的参数决定。
2、调用refreshDrawableState()重新获取背景图。
3、调用invalidate()请求View树重绘。
invalidate()
该函数的作用是请求View树进行重绘,当应用程序需要重绘某个视图时,可以调用该函数。大致做了两件事情。
1、给所有需要重绘的视图添加了一个DIRTY或者DIRTY_OPAQUE标记。
2、通过矩形运算,找到真正需要重绘的矩形区,并将其保存在了ViewRoot类中的mDirty变量中。
requestFocus()
要想让某个视图获得焦点
1、用户使用方向键将焦点移动到该视图(其实也是调用requestFocus()函数完成)。
2、直接调用视图的requestFocus()函数。
下面分析requestFocus(direction, preFocusRect)的执行过程:
1、判断该视图是不是FOCUSABLE的,如果不是,则直接返回false。
2、如果当前是Touch模式,但是视图的FOCUSABLE_IN_TOUCH_MODE却为false,即该视图不能在Touch模式下获得焦点,则直接返回false。
3、调用hasAncestorThatBlockDescendantFocus()判断是否父视图阻止该子视图获得焦点,如果阻止,则直接返回false。应用程序可以调用ViewGoup的setDescendantFocusability(int focusability)方法设置该ViewGroup是否阻止其子视图获得焦点,默认情况下都不阻止。
4、以上三步实际上执行的都是前期检查,调用handleFocusGainInternal(dir, rect)进行具体的焦点获取操作,执行完该函数后,则该视图肯定获取焦点,所以返回true。
requestLayout()
该函数的执行过程比较简单,因为当View树进行重新布局时,总是重新给所有的视图进行布局,因为,最简单的想法就是只要设置一个标识就好。
首先给mPrivateFlags添加FORCE_LAYOUT标识,然后调用mParent的requestLayout()函数。
1、调用checkThread()确保本次调用是在UI线程中执行的,非UI线程执行该函数将导致状态管理的混乱,并最终crash掉。
2、给ViewRoot中的变量mLayoutRequested赋值为true,之后真正进行布局的代码将检查该变量,并决定是否需要重新布局。
3、调用scheduleTraversals()发起一个View树遍历的消息,该消息是异步处理的,对应的处理函数是performTraversals()。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/389185.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是Hyperledger?Linux如何围绕英特尔的区块链项目构建开放平台?

访问区块链会议并关注区块链新闻时,不可避免地,您会遇到Linux基金会的Hyperledger。理解像比特币、以太坊这样的加密货币还算相对容易的,Hyperledger却不然。但如果你多研究研究,你会发现一些令人兴奋的非货币、工业区块链的应用项…

队列的链式存储结构及其实现_了解队列数据结构及其实现

队列的链式存储结构及其实现A queue is a collection of items whereby its operations work in a FIFO — First In First Out manner. The two primary operations associated with them are enqueue and dequeue.队列是项目的集合,由此其操作以FIFO(先进先出)的方…

安装

、添加一个新项目->选择类库模板->命名为DBCustomAction 2、单击项目右键->添加新项->选择安装程序类(命名为DBCustomAction.cs) 3、在 服务器资源管理器中添加->连接到 数据库->指定用户密码(选择允许保存密码)-> 数据库选择master 4、切换到DBCustomAct…

cad2016珊瑚_预测有马的硬珊瑚覆盖率

cad2016珊瑚What’s the future of the world’s coral reefs?世界珊瑚礁的未来是什么? In February of 2020, scientists at University of Hawaii Manoa released a study addressing this very question. The models they developed forecasted a 70–90% worl…

EChart中使用地图方式总结(转载)

EChart中使用地图方式总结 2018年02月06日 22:18:57 来源:https://blog.csdn.net/shaxiaozilove/article/details/79274772最近在仿照EChart公交线路方向示例,开发表示排水网和污水网流向地图,同时地图上需要叠加排放口、污染源、污水处理厂等…

android mvp模式

越来越多人讨论mvp模式,mvp在android应用开发中获得更多的重视,这里说一下对MVP的简单了解。 什么是 MVP? MVP模式使逻辑从视图层分开,目的是我们在屏幕上怎么表现,和界面如何工作的所有事情就完全分开了。 View显示数据&…

Node.js REPL(交互式解释器)

2019独角兽企业重金招聘Python工程师标准>>> Node.js REPL(交互式解释器) Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境,类似 Window 系统的终端或 Unix/Linux shell,我们可以在终端中输入命令,并接收系统…

中国移动短信网关CMPP3.0 C#源代码:使用示例

中国移动短信网关CMPP3.0 C#源代码:使用示例 中国移动短信网关CMPP3.0 C#源代码使用,在上一篇文章中我介绍过cmpp3.0,这段时间因为也做关于移动短信网关的开发,在这里给大家一个演示如何使用cmpp3.0开发移动短信网关。Using Tiray.SMS... Ti…

用python进行营销分析_用python进行covid 19分析

用python进行营销分析Python is a highly powerful general purpose programming language which can be easily learned and provides data scientists a wide variety of tools and packages. Amid this pandemic period, I decided to do an analysis on this novel coronav…

名称

命名规则:Go中函数、变量、常量、类型、语句标签和包的名称都遵循一个规则,开头是一个字母或下划线,后面跟任意字符、数字和下划线,并区分大小写。例如:heapSort和HeapSort是不同名称。关键字:Go有25个关键…

Alpha冲刺第二天

Alpha第二天 1.团队成员 郑西坤 031602542 (队长) 陈俊杰 031602504陈顺兴 031602505张胜男 031602540廖钰萍 031602323雷光游 031602319苏芳锃 0316023302.项目燃尽图 3.项目进展 时间工作内容11月18日UI设计、初步架构搭建11月19日UI设计、服务器的进一…

Tiray.SMSTiray.SMSTiray.SMSTiray.SMSTiray.SMSTiray.SMS

这是2005年6月云南移动短信网关升级到3.0时写的,在SP那稳定运行了很长时间的。因为SP倒闭了,贴出来给有兴趣的朋友参考。优点:支持多线程、滑动窗口、异步发送、全事件模式、自动识别ASCII、GBK、UCS-2缺点:不支持长短信自动分页、…

水文分析提取河网_基于图的河网段地理信息分析排序算法

水文分析提取河网The topic of this article is the application of information technologies in environmental science, namely, in hydrology. Below is a description of the algorithm for ranking rivers and the plugin we implemented for the open-source geographic…

请不要更多的基本情节

“If I see one more basic blue bar plot…”“如果我再看到一个基本的蓝色条形图……” After completing the first module in my studies at Flatiron School NYC, I started playing with plot customizations and design using Seaborn and Matplotlib. Much like doodl…

Powershell-获取DHCP地址租用信息

需求&#xff1a;业务需要获取现阶段DHCP服务器所有地址租用信息。 1.首先查看DHCP相关帮助信息&#xff1a;2.确定执行命令并获取相关帮助信息&#xff1a;help Get-DhcpServerv4Scope 名称 Get-DhcpServerv4Scope 语法 Get-DhcpServerv4Scope [[-ScopeId] <ipaddress[]>…

c# 对COM+对象反射调用时地址参数处理 c# 对COM+对象反射调用时地址参数处理

使用反射的方式调用组件里面的方法&#xff0c;经常会遇见一些象地址参数的处理&#xff0c;在C#中表现为ref参数&#xff0c;比如用C#写了一个装配件&#xff0c;里面有一个方法openProcedure(string ProcName,int paraCount,ref string[] parameters)&#xff0c;最后有一个r…

android触摸消息的派发过程

1.触摸消息是消息获取模块直接派发给应用程序的。 2.触摸消息在处理时&#xff0c; 需要根据触摸坐标计算该消息应该派发给哪个View/ViewGroup, 在案件取消处理中不存在 该计算过程。 3.没有类似”系统按键”的”系统触摸键”&#xff0c; 应用程序可完全控制触摸行为。 4.子…

python 交互式流程图_使用Python创建漂亮的交互式和弦图

python 交互式流程图Python中的数据可视化 (Data Visualization in Python) R vs Python is a constant tussle when it comes to what is the best language, according to data scientists. Though each language has it’s strengths, R, in my opinion has one cutting-edg…

机器学习解决什么问题_机器学习帮助解决水危机

机器学习解决什么问题According to Water.org and Lifewater International, out of 57 million people in Tanzania, 25 million do not have access to safe water. Women and children must travel each day multiple times to gather water when the safety of that water …

递归原来可以so easy|-连载(3)

本期我们再通过几个例子&#xff0c;加深递归的理解和熟练度。 上期有一个练习题&#xff1a;用递归逆序输出一个包含整型数据的链表。 先完成这个练习题。 对于程序员来说&#xff0c;代码是最好的沟通工具&#xff0c;什么都不说&#xff0c;上代码&#xff1a; public class…