美文网首页
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树的绘制过程。

    相关文章

      网友评论

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

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