对接N篇文章之前的performDraw()方法,View 的绘制流程最后一步的Draw流程源码分析:
首先定位到 ViewRootImpl . performDraw()方法

在这个draw()中会有个一个画布和一个用来定位范围的矩阵Rect

在这个draw()方法的最后调用了这个drawSoftware()方法,把画布,定位都放到了里边,在这个方法中通过Surface.lockCanvas(定位)获取到了一个画布。

通过下边调用清洁画布方法(擦黑板)之后会调用到View.draw()

绘制流程的六个步骤:
1、对View的背景进行绘制
2、保存当前的图层信息
3、绘制View的内容
4、对View的子View进行绘制(如果有子View)
5、绘制View的褪色的边缘,类似于阴影效果
6、绘制View的装饰

源码很长,这里简单讲下,里面主要遍历了所以子View,每个子View都调用了drawChild这个方法,我们找到这个方法
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
return child.draw(canvas, this, drawingTime);
}
这里开始调用了子view的draw,
同样开始向下遍历
那么此时,其实同理于我之前的测量和布局,父亲取得所有子控件开始遍历,调用子控件让子控件自己调用自己的draw开始绘制自己
逻辑很清晰,都是先设定绘制区域,然后利用canvas进行绘制。
那么,到目前为止,View的绘制流程也讲述完毕了
我在讲解这个UI绘制流程时主要目的是从源码分析出原理,流程, 透过流程知道我们能干嘛, 我们在对于自定义控件开发的时候, 因为他顶层源码的流程,原理, 得到我们自己能够在这个体系当中扮演什么角色,从之前的这几堂课,我们能够明白,最终,其实测量,布局,和绘制这三个流程最终都是调用到onMeasure,onLayout,onDraw让控件自己去完成的,只不过系统组件他实现帮我门已经按照它们自己的规则去完成了自己想要实现的效果,那么我们业同样是根据根据顺序,原理,去施加自己的业务,完成自己想要的自定义控件。
本文深入分析了Android中View的绘制流程,重点介绍了ViewRootImpl的performDraw()方法,并详细解释了绘制过程中的六个关键步骤。此外,还探讨了如何利用这些原理进行自定义控件的开发。
1149

被折叠的 条评论
为什么被折叠?



