Surface与Canvas的区别在哪里
Surface和Canvas都有画布的意思
但实际上,Surface才是真正和屏幕管理器打交道的画布
Canvas是对画布操作细节的封装,它更多的是和View、用户打交道
当Canvas完成一轮绘制后,会将绘制结果提交到Surface的缓冲区中,然后由Surface交给屏幕管理器绘制
Surface与Canvas是如何关联的
每个Window对应一个Surface,每个Surface对应一块屏幕缓冲区
SurfaceFlinger按照z轴顺序,将所有Surface的内容逐个绘制出来,就形成了最终的屏幕内容
ViewRootImpl每次执行draw方法时,都会通过对应的Surface创建一个新的Canvas,并指定一个绘制区域DirtyRect
DecorView在指定的Canvas和DirtyRect上,完成当前轮的绘制工作
ViewRootImpl再通过Surface,将Canvas的绘制结果提交到屏幕管理器,同时释放Canvas
当收到新一轮的绘制或刷新指令时,ViewRootImpl会再创建一个新的Canvas,重复以上工作
由此我们可以看出,Surface只有一个,而Canvas有多个,Canvas负责具体细节,而Surface直接和屏幕管理器打交道
控件执行draw的具体流程
控件执行invalidate的具体流程
控件刷新就是对指定的区域进行重绘
这个操作,实际上并不是由子View单独完成的,而是子View逐级将要重绘的Rect上报给ViewRootImpl
然后ViewRootImpl对指定区域,重新执行performDraw来完成的 特殊的View
前面提到,每个Window都是共享一个Surface
但是有一些特殊的View,Application会为它们分配独立的Surface,从而可以直接提交内容到屏幕管理器
比如SurfaceView,这是因为这些View特别耗性能,单独处理,不会影响到其它工作的响应速度