网站icp证明,韩国有哪些专业做汽车的网站?,通讯设备 技术支持 东莞网站建设,python做网站用什么一、方法介绍
1、invalidate():
invalidate方法用于在UI线程中请求重绘视图。当我们希望在主线程中更新UI时#xff0c;可以在UI线程中直接调用invalidate()方法。
内部实现#xff1a;调用了invalidate方法后#xff0c;为该View添加一个标记位#xff0c;同时不断向父…一、方法介绍
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()事件逐层向上传递直到DecorViewDecorView传递给ViewRootImplViewRootImpl#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。