View的draw流程

Posted 呼啸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了View的draw流程相关的知识,希望对你有一定的参考价值。

 View的draw流程其实很简单,官方的注释,非常清晰的说明了每一步的做法:

1.如果需要,则绘制背景。

2.保存当前canvas层。

3.绘制View的内容。

4.绘制子View.

5.如果需要,则绘制View的褪色边缘,这类似于阴影效果。

6.绘制装饰,比如滚动条。

其中2,5可以直接跳过。我们来看下剩下的步骤。

1.绘制背景

 private void drawBackground(Canvas canvas) 
        final Drawable background = mBackground;
        if (background == null) 
            return;
        

        setBackgroundBounds();

        // Attempt to use a display list if requested.
        if (canvas.isHardwareAccelerated() && mAttachInfo != null
                && mAttachInfo.mThreadedRenderer != null) 
            mBackgroundRenderNode = getDrawableRenderNode(background, mBackgroundRenderNode);

            final RenderNode renderNode = mBackgroundRenderNode;
            if (renderNode != null && renderNode.hasDisplayList()) 
                setBackgroundRenderNodeProperties(renderNode);
                ((RecordingCanvas) canvas).drawRenderNode(renderNode);
                return;
            
        

        final int scrollX = mScrollX;
        final int scrollY = mScrollY;
        if ((scrollX | scrollY) == 0) 
            background.draw(canvas);
         else 
            canvas.translate(scrollX, scrollY);
            background.draw(canvas);
            canvas.translate(-scrollX, -scrollY);
        
    

大家从下面这段代码可以看出,绘制背景考虑偏移参数scrollX和scrollY。如果有偏移值不为0,则会在偏移后的canvas中绘制背景。

 if ((scrollX | scrollY) == 0) 
            background.draw(canvas);
         else 
            canvas.translate(scrollX, scrollY);
            background.draw(canvas);
            canvas.translate(-scrollX, -scrollY);
        

以上是关于View的draw流程的主要内容,如果未能解决你的问题,请参考以下文章

View的draw流程

Android视图的绘制流程(下)——View的Layout与Draw过程

View的draw流程2

View的draw流程2

Android View体系从源码解析View的layout和draw流程

Android应用层View绘制流程之measure,layout,draw三步曲