Android View绘制:invalidate()与measure()深度解析
48 浏览量
更新于2024-08-28
收藏 191KB PDF 举报
"Android系统中,View的绘制流程是一个复杂而关键的过程,涉及到视图的测量、布局和绘制。此过程主要在ViewRootImpl类的performTraversals()方法中执行,该方法会检查并执行测量、布局和绘制三个步骤,以确保View树的正确显示。"
在Android开发中,理解View的绘制流程对于优化性能和定制自定义视图至关重要。首先,我们来详细探讨`measure()`过程。当系统需要确定View及其子View的尺寸时,会触发`measure()`方法。这个过程是由ViewRootImpl的`measure()`方法开始,通过调用ViewGroup的`onMeasure()`方法,递归地为每一个子View进行测量。
`onMeasure()`方法的主要任务是设定每个View的尺寸,这包括调用`setMeasuredDimension()`来设置`mMeasuredWidth`和`mMeasuredHeight`。对于ViewGroup,还需要遍历并测量其所有子View。通常,ViewGroup会使用`measureChildWithMargins()`方法来处理子View的测量,它考虑了子View的边距。
`measure()`函数本身是final的,不能被重载,但`onMeasure()`方法可以被子类重写以实现自定义的尺寸计算逻辑。在这个方法中,开发者可以使用`MeasureSpec`参数来处理不同类型的测量模式(EXACTLY, AT_MOST, UNSPECIFIED),这些模式决定了View应该如何处理其父View分配的尺寸。
接下来是`layout()`步骤,此过程负责确定View在屏幕上的位置。在`performTraversals()`中,系统会根据已测量的尺寸来调整View的位置。ViewGroup的`layout()`方法会递归地布局其子View,确保每个子View都在正确的位置。
最后,`draw()`阶段将绘制View到屏幕上。这包括绘制背景、边界、内容以及任何叠加层。`draw()`方法会调用`onDraw()`,这是一个可以被子类重写的方法,用于自定义视图的绘制行为。
`invalidate()`方法是与绘制流程紧密相关的。当调用`invalidate()`时,它会标记当前View为脏,表示需要重新绘制。这会触发视图树的重绘过程,从`performTraversals()`开始,重新执行测量、布局和绘制的流程。
Android的View绘制流程是一个深度优先的递归过程,从ViewRootImpl开始,通过`measure()`、`layout()`和`draw()`三个主要步骤,确保每个View都正确地计算尺寸、定位并显示。理解这个流程可以帮助开发者优化UI性能,解决布局问题,并实现复杂的自定义视图效果。
2426 浏览量
2021-01-20 上传
2021-01-20 上传
2016-11-08 上传
150 浏览量
2017-03-24 上传
点击了解资源详情
点击了解资源详情
weixin_38513665
- 粉丝: 5
- 资源: 936
最新资源
- shaynelarocque.github.io:shaynelarocque.github.io
- find_unused_open_ports
- 【WordPress插件】2022年最新版完整功能demo+插件2.2.1.zip
- Data-Science-IIHT:IIHT数据科学日志和工作表
- DOTween Pro v0.9.290.zip
- Club-management
- stinedeck:使用Flask,Python,MongoDB和Javascript jQuery创建的数字抽认卡应用程序
- PhotoshootMap
- WheelPicker:轮选择器
- spring-2021-work-Blua2:GitHub Classroom创建的spring-2021-work-Blua2
- Lucille MPD client:音乐播放器守护程序的客户端-开源
- micr1
- simple-cv
- 分数阶傅里叶变换.zip
- ci-app
- Entity_Resolution_Service_Intermediary_OSGi