您当前的位置: 首页 >  ui

命运之手

暂无认证

  • 1浏览

    0关注

    747博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【高级UI】【007】Surface与Canvas,draw和invalidate具体流程

命运之手 发布时间:2021-10-14 12:50:49 ,浏览量:1

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特别耗性能,单独处理,不会影响到其它工作的响应速度

关注
打赏
1654938663
查看更多评论
立即登录/注册

微信扫码登录

0.0406s