1、问题
View经过了Measure和Layout这个两个过程后,View的大小已确定,以及View的位置也确定,接下来就是要把View显示出来,这里我将继续分析View的Draw过程。
2、分析
Draw过程的入口点从ViewRootImpl.performTraversals( )方法开始,在perforMeasure()和perforLayout( )后,接下来来就是执行perforDraw( )方法
private void draw(boolean fullRedrawNeeded) {
Surface surface = mSurface;
。。。省略
if (!dirty.isEmpty() || mIsAnimating || accessibilityFocusDirty) {
// 更加是否开启硬件加速来进行不同的处理,是否开启硬件加速,View的绘制流畅都是一样的,区别就是Canvas不一样
if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) {
。。。省略
// 开启了硬件加速,则走该分支
mAttachInfo.mHardwareRenderer.draw(mView, mAttachInfo, this);
} else {
。。。省略
// 未开启硬件加速,就走这个分支
if (!drawSoftware(surface, mAttachInfo, xOffset, yOffset, scalingRequired, dirty)) {
return;
}
}
}
}
我们只分析未开启硬件加速的绘制流程
private boolean drawSoftware(Surface surface, AttachInfo attachInfo, int xoff, int yoff,
boolean scalingRequired, Rect dirty) {
final Canvas canvas;
。。。省略
// 从surface得到画布
canvas = mSurface.lockCanvas(dirty);
try {
。。。省略
// 调用DecorView.draw(),把DecorView的内容以及DecorView子View的内容都绘制在这个画布上
mView.draw(canvas);
} finally {