requestLayout和invalidate区别?
一、requestLayout和invalidate区别
1、requestLayout会直接递归调用父窗口的requestLayout,直到ViewRootImpl,然后触发peformTraversals,由于mLayoutRequested为true,会导致onMeasure和onLayout被调用。不一定会触发OnDraw 。
2、requestLayout触发onDraw可能是因为在在layout过程中发现l,t,r,b和以前不一样,那就会触发一次invalidate,所以触发了onDraw,也可能是因为别的原因导致mDirty非空(比如在跑动画) 。
3、view的invalidate不会导致ViewRootImpl的invalidate被调用,而是递归调用父view的invalidateChildInParent,直到ViewRootImpl的invalidateChildInParent,然后触发peformTraversals,会导致当前view被重绘,由于mLayoutRequested为false,不会导致onMeasure和onLayout被调用,而OnDraw会被调用。
延伸阅读:
二、View绘制的三个步骤
View绘制分三个步骤,顺序是:onMeasure,onLayout,onDraw。经代码亲测,log输出显示:调用invalidate方法只会执行onDraw方法;调用requestLayout方法只会执行onMeasure方法和onLayout方法,并不会执行onDraw方法。
所以当我们进行View更新时,若仅View的显示内容发生改变且新显示内容不影响View的大小、位置,则只需调用invalidate方法;若View宽高、位置发生改变且显示内容不变,只需调用requestLayout方法;若两者均发生改变,则需调用两者,按照View的绘制流程,推荐先调用requestLayout方法再调用invalidate方法。

猜你喜欢LIKE
相关推荐HOT
更多>>
Sequel Pro的Windows版替代品及优缺点是什么?
一、Sequel Pro的Windows版替代品及优缺点通过客户端方式的,免费的有MySQL Workbench,MySQL官方出品;收费的有Navicat,挺出名的也挺好用。通...详情>>
2023-10-20 23:39:05
对于大流量的网站,采用什么样的方法来解决各页面访问量统计问题?
一、对于大流量的网站解决各页面访问量统计问题的方法1、使用日志分析工具日志分析工具可以记录每一个用户访问网站的请求,并根据相应的日志信...详情>>
2023-10-20 22:41:13
为什么不推荐使用try-with-finally处理Java异常?
一、不推荐使用try-with-finally处理Java异常的原因1、代码冗余使用 try-with-finally 时,需要在 finally 块中编写释放资源的代码,这可能导致...详情>>
2023-10-20 21:12:04
KVO的本质是什么?
一、KVO的本质KVO(Key-Value Observing)是指在软件开发中一种观察者模式的实现,它允许对象监听其他对象特定属性的变化,并在属性值发生改变...详情>>
2023-10-20 20:38:54热门推荐
Sequel Pro的Windows版替代品及优缺点是什么?
沸SQL/Oracle数据库是怎样与GIS的应用相联系起来的?
热对于大流量的网站,采用什么样的方法来解决各页面访问量统计问题?
热常见的软件设计模式有哪些?
新Mysql为什么只能支持2000w左右的数据量?
为什么不推荐使用try-with-finally处理Java异常?
KVO的本质是什么?
Java中CycliBarriar和CountdownLatch的区别?
为什么列存储数据库读取速度会比传统的行数据库快?
为什么要学IO模型?
LayoutInflater.inflate()方法两个参数和三个参数的区别?
Python传参传什么?
为什么GIL让多线程变得如此鸡肋?
web前端开发学习路线?
技术干货






