分析ondraw()过程

来源:互联网 发布:php门户网站源码 编辑:程序博客网 时间:2024/06/05 19:08
(1)从ViewRootImpl的performDraw()方法开始,其调用了ViewRootImpl的draw方法
private void performDraw() {
if (mAttachInfo.mDisplayState == Display.STATE_OFF && !mReportNextDraw) {
return;
}

final boolean fullRedrawNeeded = mFullRedrawNeeded;
mFullRedrawNeeded = false;

mIsDrawing = true;
Trace.traceBegin(Trace.TRACE_TAG_VIEW, "draw");
try {
draw(fullRedrawNeeded);
} finally {
mIsDrawing = false;
Trace.traceEnd(Trace.TRACE_TAG_VIEW);
}

(3)而ViewRootImpl的draw方法最终调用了本身的drawSoftware方法:
private voiddraw(booleanfullRedrawNeeded) {
...
if(!drawSoftware(surface,mAttachInfo, xOffset, yOffset, scalingRequired, dirty)) {
return;
}

(4)ViewRootImpl的drawSoftware方法,最终调用了View的draw方法
private booleandrawSoftware(Surface surface, AttachInfo attachInfo,intxoff, intyoff,
booleanscalingRequired, Rect dirty) {
...

try{
canvas.translate(-xoff, -yoff);
if(mTranslator!= null) {
mTranslator.translateCanvas(canvas);
}
canvas.setScreenDensity(scalingRequired ?mNoncompatDensity: 0);
attachInfo.mSetIgnoreDirtyState =false;

mView.draw(canvas);

drawAccessibilityFocusedDrawableIfNeeded(canvas);
}finally{
if(!attachInfo.mSetIgnoreDirtyState) {
// Only clear the flag if it was not set during the mView.draw() call
attachInfo.mIgnoreDirtyState =false;
}
}

(5) mView.draw调用的是DecorView的draw方法,其会先调用super.draw
@Override
public voiddraw(Canvas canvas) {
super.draw(canvas);
它的super是FrameLayout,其实就是View的draw方法


(6)View的draw方法:

public voiddraw(Canvas canvas) {
final intprivateFlags =mPrivateFlags;
final booleandirtyOpaque = (privateFlags &PFLAG_DIRTY_MASK) ==PFLAG_DIRTY_OPAQUE&&
(mAttachInfo== null|| !mAttachInfo.mIgnoreDirtyState);
mPrivateFlags= (privateFlags & ~PFLAG_DIRTY_MASK) | PFLAG_DRAWN;

/*
* Draw traversal performs several drawing steps which must be executed
* in the appropriate order:
*
* 1. Draw the background
* 2. If necessary, save the canvas' layers to prepare for fading
* 3. Draw view's content
* 4. Draw children
* 5. If necessary, draw the fading edges and restore layers
* 6. Draw decorations (scrollbars for instance)
*/

// Step 1, draw the background, if needed
intsaveCount;
//dirtyOpaque:背景不是透明的
//通常情况下ViewGroup不走onDraw方法,但当设置背景的时候,会调用其onDraw方法
if(!dirtyOpaque) {
drawBackground(canvas);
}
...

1 0
原创粉丝点击