背景
在文章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()方法画之