首页 > 移动开发 > ANDROID > Android中invalidate
在Android自定义View的开发中,Invalidate是非常常用的一个方法,这边对这个方法的相关步骤进行一个解析
1、首先,Invalidate调用view.invalidateInternal传入当前view的位置参数

2、在invalidateInternal中判断当前view的状态,是否需要重绘,然后通过父View的invalidateChild方法,将需要重绘的区域传递给父View

3、接下来让我们看一下invalidateChild,在invalidateChild中先是设置了需要重绘的区域dirty,之后再do…while中,反复的调用parent = parent.invalidateChildInParent()方法,来调用父类的invalidateChildInParent对View的重绘请求进行传递
4、然后在ViewGroup.invalidateChildInParent中使用offset,把子View需要重绘的坐标区域转换为父View中的坐标区域。之后使用union对子View与父View的区域进行集合运算,获得需要绘制的区域。
5、在ViewRootImpl.invalidateInparent中,进入之后会线程以及重绘区域的检查,之后调用invalidateRectOnScreen方法,然后调用scheduleTraversals()方法
6、ViewRootImpl.scheduleTraversals里面,将会之后handler,之后会调用mTraversalRunnable类,从而调用doTraversal方法,最后调用performTraversals()执行ViewTree的遍历

7、ViewRootImpl.performTraversals()中,在其中进行View的是否可见,是否为surfasce,是否正在绘制,是否存在于删除列表中等判断,之后调用performDraw()开始执行绘制。在performDraw()又调用了ViewRootImpl的draw方法,并传递了fullRedrawNeeded参数,此参数源自mFullRedrawNeeded成员变量,用于表示是否需要重新绘制全部的View

设置了需要重绘的区域dirty
8、然后就会调用ViewRootImpl.draw,在draw方法中,根据传如fullRedrawNeeded参数,设置需要重绘的dirty区域,最后调用drawSoftware方法,把参数传递进去

9、最后ViewRootImpl.drawSoftware中,首先对canvas进行一些属性设置,包括色块、平移等。之后调用mView.draw(canvas)方法,开始对View进行绘制

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69917874/viewspace-2765320/ ,如需转载,请注明出处,否则将追究法律责任。