目的:通过一个Demo在所有自定义类中覆写所有invalidate开头的方法,打印LOG,看看Framework invalidate流程都执行了哪些方法
一 例子布局 与 树形结构图
二 先看看效果 源码下载
View invalidateDrawable(Drawable drawable)
View invalidate , l = 0 , t = 0 , r = 90 , b = 90
LinearLayout invalidateChildInParent Rect Left = 0, right = 90, top = 0, bottom = 90
LinearLayout Location 0 = 55
LinearLayout Location 1 = 55
RelativeLayout invalidateChildInParent Rect Left = 55, right = 145, top = 55, bottom = 145
invalidateChildInParent Location 0 = 60
invalidateChildInParent Location 1 = 115
四 根据LOG,分析invalidate流程
1. 首先会触发绿色区域View的invalidate方法,并传入需重绘区域信息
View invalidateDrawable(Drawable drawable)
View invalidate , l = 0 , t = 0 , r = 90 , b = 90
2. 绿色区域view会把invalidate请求传递给黄色区域(LinearLayout),对传递重绘区域的信息
LinearLayout invalidateChildInParent Rect Left = 0, right = 90, top = 0, bottom = 90
LinearLayout Location 0 = 55
LinearLayout Location 1 = 55
3. 黄色区域又把invalidate请求传递给蓝色区域(RelativeLayout),,对传递针对黄色区域的重绘信息
RelativeLayout invalidateChildInParent Rect Left = 55, right = 145, top = 55, bottom = 145
invalidateChildInParent Location 0 = 60
invalidateChildInParent Location 1 = 115
五 总结 invalidate的传递流程
点击绿色区域,由绿色区域触发invalidate,首先传递给黄色区域带有区域信息,再传递给蓝色区域带有区域信息,含有区域信息的目的是仅重绘此区域。