SeniorUI0203_分析ondraw()过程

高级UI汇总

(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 void draw(boolean fullRedrawNeeded) {

...

if (!drawSoftware(surface, mAttachInfo, xOffset, yOffset, scalingRequired, dirty)) {

return;

}

 

(4)ViewRootImpl的drawSoftware方法,最终调用了View的draw方法

private boolean drawSoftware(Surface surface, AttachInfo attachInfo, int xoff, int yoff,

boolean scalingRequired, 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 void draw(Canvas canvas) {

super.draw(canvas);

它的super是FrameLayout,其实就是View的draw方法

 

 

(6)View的draw方法:

 

public void draw(Canvas canvas) {

final int privateFlags = mPrivateFlags;

final boolean dirtyOpaque = (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

int saveCount;

//dirtyOpaque:背景不是透明的

//通常情况下ViewGroup不走onDraw方法,但当设置背景的时候,会调用其onDraw方法

if (!dirtyOpaque) {

drawBackground(canvas);

}

...

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值