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。

相关推荐

  1. “==”和“equals”区别

    2024-04-02 20:42:02       61 阅读
  2. == 和 equals 区别

    2024-04-02 20:42:02       64 阅读
  3. #{}和${}区别

    2024-04-02 20:42:02       34 阅读
  4. &&和&区别

    2024-04-02 20:42:02       39 阅读
  5. ==与===区别

    2024-04-02 20:42:02       34 阅读
  6. &与 && 区别

    2024-04-02 20:42:02       30 阅读
  7. TCP/UDP区别

    2024-04-02 20:42:02       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-02 20:42:02       91 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-02 20:42:02       97 阅读
  3. 在Django里面运行非项目文件

    2024-04-02 20:42:02       78 阅读
  4. Python语言-面向对象

    2024-04-02 20:42:02       88 阅读

热门阅读

  1. FastAPI Web框架教程 第11章 请求响应的进阶用法

    2024-04-02 20:42:02       30 阅读
  2. 蓝桥杯刷题记录之质数

    2024-04-02 20:42:02       33 阅读
  3. nignx的功能包括哪些

    2024-04-02 20:42:02       34 阅读
  4. LeetCode226.翻转二叉树

    2024-04-02 20:42:02       36 阅读
  5. 洛谷 B3918 [语言月赛 202401] 图像变换

    2024-04-02 20:42:02       35 阅读
  6. Ubuntu设置中文输入法教程

    2024-04-02 20:42:02       37 阅读
  7. 题目 1567: 超级玛丽

    2024-04-02 20:42:02       36 阅读