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