1.从简单的现象出发
当布局关系如下图所示时,其中Child1和Child2有重叠
Applictaion关闭硬件绘制
1 2 3 4 5 6 7 8 |
2020-04-09 23:48:27.506 7664-7664/com.lkchan.myapplication E/Child1: parent:ParentLayout1 call: invalidate() 2020-04-09 23:48:27.587 7664-7664/com.lkchan.myapplication E/ParentLayout1: parent:LinearLayout call: dispatchDraw(Canvas canvas) 2020-04-09 23:48:27.588 7664-7664/com.lkchan.myapplication E/Child1: parent:ParentLayout1 call: draw(Canvas canvas) 2020-04-09 23:48:27.588 7664-7664/com.lkchan.myapplication E/Child2: parent:ParentLayout1 call: draw(Canvas canvas) 2020-04-09 23:48:27.588 7664-7664/com.lkchan.myapplication E/ParentLayout2: dispatchDraw(Canvas canvas) |
使用软件绘制时,调用invalidate时候可以发现兄弟 Child2也进行了绘制,ParentLayout1的兄弟节点ParentLayout2 虽然执行了dispatchDraw,但是子控件并没有重绘
Applictation打开硬件绘制时
1 2 3 4 |
2020-04-11 00:12:29.468 4557-4557/com.lkchan.myapplication E/Child1: parent:ParentLayout1 call: invalidate() 2020-04-11 00:12:29.481 4557-4557/com.lkchan.myapplication E/Child1: parent:ParentLayout1 call: draw(Canvas canvas) |
使用硬件绘制时,调用invalidate可以发现仅仅是Child1进行绘制但是Child2没有进行绘制
从上面的现象可以发现,硬件绘制时,即使view有重叠,在刷新ui的时候也可以保持只绘制一个,而且不管是软件还是硬件,父亲的兄弟节点之后的view也不需要重绘,这表明一个问题,使用硬件绘制和软件绘制的时候,方法的调用流程似乎是不一样的。