美文网首页
View的工作流程(3)Draw绘制

View的工作流程(3)Draw绘制

作者: m1Ku | 来源:发表于2019-08-05 11:25 被阅读0次

Draw绘制流程

Draw绘制流程主要是要将经过测量和布局后的View绘制在屏幕上。

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;

    if (!dirtyOpaque) {
        drawBackground(canvas);
    }

    // skip step 2 & 5 if possible (common case)
    final int viewFlags = mViewFlags;
    boolean horizontalEdges = (viewFlags & FADING_EDGE_HORIZONTAL) != 0;
    boolean verticalEdges = (viewFlags & FADING_EDGE_VERTICAL) != 0;
    if (!verticalEdges && !horizontalEdges) {
        // Step 3, draw the content
        if (!dirtyOpaque) onDraw(canvas);

        // Step 4, draw the children
        dispatchDraw(canvas);

        drawAutofilledHighlight(canvas);

        // Overlay is part of the content and draws beneath Foreground
        if (mOverlay != null && !mOverlay.isEmpty()) {
            mOverlay.getOverlayView().dispatchDraw(canvas);
        }

        // Step 6, draw decorations (foreground, scrollbars)
        onDrawForeground(canvas);

        // Step 7, draw the default focus highlight
        drawDefaultFocusHighlight(canvas);

        if (debugDraw()) {
            debugDrawFocus(canvas);
        }

        // we're done...
        return;
    }
        //...
}

如代码上注释所示,View的绘制过程主要有如下几步

  1. 如果需要的话,先绘制背景
  2. 绘制View的内容
  3. 绘制所有的children
  4. 绘制装饰,如Scrollbars等

onDraw方法由View的子类实现并完成具体的绘制过程。dispatchDraw方法在ViewGroup中实现,该方负责传递绘制过程,方法中遍历调用了child的draw方法完成child的绘制。最后调用onDrawForeground绘制View的前景或者装饰,这样就完成了View树的绘制过程。

相关文章

  • Android面试复习笔记 3

    3. View体系 1. View绘制流程 View 绘制中主要流程分为measure,layout, draw ...

  • View的工作流程(3)Draw绘制

    Draw绘制流程 Draw绘制流程主要是要将经过测量和布局后的View绘制在屏幕上。 View的draw方法 如代...

  • View的面试锦囊

    View的draw流程 绘制背景 绘制自己 绘制子View 绘制装饰 View.getLocationInWind...

  • draw流程

    一、View的draw()流程 draw(入口)-> drawBackground(绘制背景)-> onDraw(...

  • Android日记之View的绘制流程

    前言 View的绘制流程,其实也就是工作流程,指的就是Measure(测量)、Layout(布局)和Draw(绘制...

  • View

    说说View的绘制流程? View的工作流程主要是指measure、layout、draw这三大流程,即测量、布局...

  • Android中view的绘制流程原理详解

    view的绘制流程 view的绘制流程分为mesure、layout和draw三个阶段,measure是对view...

  • android源码之View绘制

    view 绘制主要流程 measure 计算view的大小 layout 计算view的位置 draw 绘制v...

  • 4.1View相关-View绘制详解

    View的绘制机制 view树的绘制流程 measure方法 layout方法 draw方法 1.view树的绘制...

  • Android系统_View.draw解析

    图文概括 流程 绘制背景 绘制内容 分发子View绘制 绘制装饰 源码分析 View.draw ViewGroup...

网友评论

      本文标题:View的工作流程(3)Draw绘制

      本文链接:https://www.haomeiwen.com/subject/ziipdctx.html