安卓开发学习之线性布局的绘制过程

背景

在文章Android开发学习之线性布局测量流程源码阅读安卓开发学习之LinearLayout的布局过程中,我分别记录了阅读线性布局的测量和布局过程,然后到了最后一步:绘制

线性布局的绘制就是覆写了一下View的onDraw()方法


LinearLayout.onDraw()

代码如下

    @Override
    protected void onDraw(Canvas canvas) {
        if (mDivider == null) {
            return;
        }

        if (mOrientation == VERTICAL) {
            drawDividersVertical(canvas);
        } else {
            drawDividersHorizontal(canvas);
        }
    }

以竖直方向为例,阅读drawDividersVertical()方法


drawDividersVertical()

代码如下

void drawDividersVertical(Canvas canvas) {
        final int count = getVirtualChildCount();
        for (int i = 0; i < count; i++) {
            final View child = getVirtualChildAt(i);
            if (child != null && child.getVisibility() != GONE) {
                if (hasDividerBeforeChildAt(i)) {
                    final LayoutParams lp = (LayoutParams) child.getLayoutParams();
                    final int top = child.getTop() - lp.topMargin - mDividerHeight; // 第i个分割线的顶端
                    drawHorizontalDivider(canvas, top);
                }
            }
        }

        if (hasDividerBeforeChildAt(count)) {
            final View child = getLastNonGoneChild();
            int bottom = 0;
            if (child == null) {
                bottom = getHeight() - getPaddingBottom() - mDividerHeight;
            } else {
                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
                bottom = child.getBottom() + lp.bottomMargin; // 最底下的分割线的顶端(其实分割线无所谓顶端底端)
            }
            drawHorizontalDivider(canvas, bottom);
        }
}

代码很简单,一个遍历,确定分割线们的位置,调用了drawHorizontalDivider()方法


drawHorizontalDivider

代码如下

void drawHorizontalDivider(Canvas canvas, int top) {
        mDivider.setBounds(getPaddingLeft() + mDividerPadding, top,
                getWidth() - getPaddingRight() - mDividerPadding, top + mDividerHeight);
        mDivider.draw(canvas);
}

设置分割线的边界,调用draw()方法画之


结语

线性布局本身的绘制,其实就是画了一些分割线,关于它如何绘制子view以及它的onDraw()方法在哪儿调用,参见 参加安卓开发学习之View的draw(canvas)方法一文

猜你喜欢

转载自blog.csdn.net/qq_37475168/article/details/80323430