分析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
- 分析ondraw()过程
- ondraw
- Android画布更新过程OnDraw调用过程
- view的onMeasure,onLayout,onDraw源码分析
- OnPaint OnDraw OnPrint 的区别以及invalidate的调用过程
- 9.view 绘制过程,讲讲draw/onDraw和drawChild
- android,view的执行过程onDraw、onSizeChanged,onFinishInflate
- android,view的执行过程 onDraw、onSizeChanged,onFinishInflate
- 9.view 作图过程,讲讲draw/onDraw和drawChild
- 源码分析:onAttach, onMeasure, onLayout, onDraw 的顺序。
- [置顶] 源码分析:onAttach, onMeasure, onLayout, onDraw 的顺序。
- 源码分析:onAttach, onMeasure, onLayout, onDraw 的顺序。
- view的onMeasure,onLayout,onDraw源码分析(下)
- Android onDraw
- Android onDraw
- onPaint&onDraw
- CTreeView OnDraw
- surfaceview ondraw
- Jvm的配置参数
- 2016湖南省省赛G题
- 二叉树的后序遍历(leetcode 145)
- 怎么完整的写单例
- 原码、反码、补码和移码其实很简单
- 分析ondraw()过程
- 嵌入式车牌识别,DSP平台
- 2017-5-9 C++笔记
- [CSU 1923 Mysterious Block D]哈希
- 腾讯云正式加入 CNCF 和 Linux 基金会
- 5.9作业
- 用辗转相除法求最大公约数和最小公倍数
- js原生态的Ajax实现+SpringMVC
- ScrollView嵌套ListView,ListView为什么只显示第一行的高度