View的draw流程2

Posted 呼啸

tags:

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

3.绘制View的内容

这一步调用了View的onDraw方法。这个方法是一个空实现,因为不同的view有着不同的内容。所以这需要我们自己去实现。就是在自定义View中重写该方法来实现。

4.绘制子view

这一步调用了dispatchDraw方法。这个方法也是一个空实现。ViewGroup中重写了这个方法。在ViewGroup的dispatchDraw方法中,对子View进行遍历。并调用drawChild方法。在drawChild方法中,主要调用了view的draw方法。在draw方法中,会判断有没有缓存,如果没有,则正常绘制。如果有,则使用缓存显示。

6.绘制装饰

这一步是使用View的onDrawForeground方法。

 public void onDrawForeground(Canvas canvas) 
        onDrawScrollIndicators(canvas);
        onDrawScrollBars(canvas);

        final Drawable foreground = mForegroundInfo != null ? mForegroundInfo.mDrawable : null;
        if (foreground != null) 
            if (mForegroundInfo.mBoundsChanged) 
                mForegroundInfo.mBoundsChanged = false;
                final Rect selfBounds = mForegroundInfo.mSelfBounds;
                final Rect overlayBounds = mForegroundInfo.mOverlayBounds;

                if (mForegroundInfo.mInsidePadding) 
                    selfBounds.set(0, 0, getWidth(), getHeight());
                 else 
                    selfBounds.set(getPaddingLeft(), getPaddingTop(),
                            getWidth() - getPaddingRight(), getHeight() - getPaddingBottom());
                

                final int ld = getLayoutDirection();
                Gravity.apply(mForegroundInfo.mGravity, foreground.getIntrinsicWidth(),
                        foreground.getIntrinsicHeight(), selfBounds, overlayBounds, ld);
                foreground.setBounds(overlayBounds);
            

            foreground.draw(canvas);
        
    

很明显这个方法用于绘制scrollBar以及其他装饰。并将它们绘制在视图内容的上层。

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

View的draw流程

View的draw流程

Android View 绘制流程(Draw) 完全解析

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

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

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