Android invalidate、postInvalidate、requestLayout的区别

一、方法介绍

1、invalidate():

invalidate方法用于在UI线程中请求重绘视图。当我们希望在主线程中更新UI时,可以在UI线程中直接调用invalidate()方法。

内部实现:调用了invalidate方法后,为该View添加一个标记位,同时不断向父容器请求刷新,父容器通过计算得出自身需要重绘的区域,直到传递到ViewRootImpl中,最终触发performTraversals方法,开始View树重绘流程(只绘制需要重绘的视图)

2、postInvalidate():

postInvalidate方法用于在非UI线程中请求重绘视图。如果我们希望在非UI线程中更新UI,就需要使用postInvalidate()方法。

内部实现:当调用postInvalidate()方法时,系统会通过Handler将重绘任务添加到主线程的消息队列中。在UI线程的消息循环中,当处理到该消息时,会触发invalidate()方法来进行实际的重绘操作。这样可以确保在非UI线程中请求的重绘操作在主线程中执行,避免多线程并发导致的问题。

3、requestLayout():

requestLayout方法用于请求重新布局视图。当我们希望更新视图的尺寸或位置时,需要调用requestLayout()方法。该方法会触发视图层次结构的重新测量、布局和绘制过程。例如,当修改了视图的宽度、高度、位置或其他布局参数时,应调用requestLayout()方法来请求重新布局。

内部实现:调用requestLayout方法,标记当前View及父容器,requestLayout()事件逐层向上传递,直到DecorView,DecorView传递给ViewRootImpl,ViewRootImpl#requestLayout()接收并处理该事件【最终走到这个方法ViewRootImpl.scheduleTraversals()】。ViewRootImpl会调用三大流程,从measure开始,对于每一个含有标记位的view及其子View进行测量onMeasure、布局onLayout、绘制onDraw。

二、相同点

都是用来更新Android视图的方法

三、不同点

1、invalidate方法用于在主线程中请求重绘视图,postInvalidate方法可以再非UI线程中调用

2、invalidate和postInvalidate方法只会触发onDraw方法,requestLayout会触发onMeasure和onLayout方法,当view的位置发生改变才会执行onDraw方法,因此如果要使当前view重绘需要调用invalidate。

疑问 :
requestLayout()何时不会触发onDraw()?

如果没有改变控件的left\right\top\bottom就不会触发onDraw()
invalidate()在什么情况下不会触发onDraw?

在ViewGroup中,invalidate默认不重新绘制子view。
如何让ViewGroup在invalidate时会触发onDraw?

本质需要将ViewGroup的dirtyOpaque设置为false

1.在构造函数中调用setWillNotDraw(false);

2.给ViewGroup设置背景。调用setBackground。

相关推荐
AFinalStone5 小时前
Android 7系统无障碍服务(六)输入事件拦截与 TouchExplorer
android·无障碍服务
天空之城--5 小时前
MT管理器Android逆向工程完全指南:从入门到实战
android
Anhty7 小时前
2026九月最新变声器测评:iOS安卓双端适配,低延迟运行更稳定
android·人工智能·功能测试·ios·智能手机
渡我白衣8 小时前
并查集:基础认识与模拟实现
android·java·javascript·数据结构·c++·算法·并查集
Android-Flutter10 小时前
flutter GetX 详解
android·flutter
MyFreeIT11 小时前
Android Manual
android
hai_android12 小时前
AIDL 实现 IPC 进程间通信
android·android studio
AFinalStone14 小时前
Android 7系统无障碍服务(五)AccessibilityNodeInfo 的构建与查询
android·无障碍服务
今天要早睡_14 小时前
C++ 核心语法速过:命名空间、引用、函数重载与 nullptr 深度解析
android·java·c++
啦啦啦~~~22215 小时前
PC端+安卓端阅读器推荐!开源本地小说阅读器软件,
android·论文阅读·windows·开源软件·福昕阅读器